Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/12/2007, 15h34   #1
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Par défaut Comment boucler sur un curseur retourné par une fonction

Bonjour,

Une fonction retourne un curseur, voici son entête :

Code sql :
1
2
CREATE OR REPLACE FUNCTION searchdocuments ()
   RETURN TYPES.documents_cursor

Le script du type curseur est le suivant :

Code sql :
1
2
3
4
CREATE OR REPLACE PACKAGE types
AS
     TYPE documents_cursor IS REF CURSOR;	 
END;

Et l'utilisation de la fonction :

Code sql :
1
2
3
4
5
6
7
8
9
DECLARE
 
retval TYPES.documents_cursor;   
 
BEGIN
 
   retval := searchdocuments ();
 
END;

Mais je n'ai pas trouvé la bonne syntaxe pour parcourir la variable retval.

Auriez vous une idée ?


Merci d'avance
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2007, 22h24   #2
Membre habitué
 
Inscription : janvier 2007
Messages : 148
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 148
Points : 145
Points : 145
Je me rappel l'avoir fait, mais je n'ai pas l'exemple sous les yeux.

Mais si je me souvient bien j'avais créer un record avec le même nom de champ que lors de la définition du curseur de la fonction.

Sinon dans le même genre voici ce qu'on peu voir :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
SQL> Declare
  2    -- déclaration du curseur
  3    CURSOR C_EMP IS
  4    SELECT
  5       empno
  6      ,ename
  7      ,job
  8    FROM
  9      EMP 
 10    ;
 11    -- variables d'accueil 
 12    LN$Num EMP.empno%Type ;
 13    LC$Nom EMP.ename%Type ;
 14    LC$Job EMP.job%Type ; 
 15  Begin  
 16    Open C_EMP ; -- ouverture du curseur
 17    Loop -- boucle sur les lignes
 18      Fetch C_EMP INTO LN$Num, LC$Nom, LC$Job ; -- Lecture d'une ligne
 19      Exit When C_EMP%NOTFOUND ; -- sortie lorsque le curseur ne ramène plus de ligne
 20    End loop ;
 21    Close C_EMP ; -- fermeture du curseur
 22  End ;
 23  /
Je pense que si tu déclare ton curseur dans une fonction et que tu l'ouvre dans une procédure appelante, tu peux expliciter tes variables, voir ton record :

Déclaration du cursuer :
Select colonne1 as ma_colonne1, colonne2 as ma_colonne2 from table;

Avec colonne un varchar(40) et colonne2 un number(10)

Tu fetch le curseur dans deux variables bien typées, ou un record typé correctement avec les noms ma_colonne1 et ma_colonne2.

Enfin il me semble que j'avais fais comme ca, si tu t'en sors pas je retrouverais ca au boulo =)
Delwyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2007, 09h53   #3
Rédacteur
 
Avatar de elitost
 
Homme Eric REBOISSON
Consultant informatique
Inscription : septembre 2003
Messages : 2 032
Détails du profil
Informations personnelles :
Nom : Homme Eric REBOISSON
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 2 032
Points : 3 133
Points : 3 133
Envoyer un message via ICQ à elitost Envoyer un message via AIM à elitost Envoyer un message via MSN à elitost Envoyer un message via Yahoo à elitost Envoyer un message via Skype™ à elitost
Juste avant de partir vendredi j'ai réussi à boucler sur le curseur en déclarant un objet RECORD contenant les différents champs retounés par le curseur puis en déclarant un curseur retournant ce RECORD.

Et ensuite le traditionnel FETCH sur le curseur.

Dès que je reviens au bureau le 3 janvier je tâcherai de poster le code de ce que j'ai fais, mais pour le moment je bulle
elitost est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h31.


 
 
 
 
Partenaires

Hébergement Web