je cherche a écrire une fonction oracle (8i) qui retourne plusieurs lignes.
exemple :
retourner l'ensemble des utilisateurs qui sont inscrit depuis plus de 6 mois
je cherche a écrire une fonction oracle (8i) qui retourne plusieurs lignes.
exemple :
retourner l'ensemble des utilisateurs qui sont inscrit depuis plus de 6 mois
Simple ta fonction devra retournée un type d'objet utilisateur de type table PL/SQL de record
merci pour ta reponsemalheureusement j'ai pas tous suivi à ta reponse
tu n'as pas un exemple que je comprenne en le lisant ?
En gros en suppposant que tu souhaites recupere toute les informations d'une table et que tu souhaites les passer à une autre fonction
exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 --Tu veux renvoyer X fois les informations nom, et link -- Donc tu crées un record qui correspond aux 2 infos TYPE type_record IS RECORD( nom VARCHAR2(50), link VARCHAR2(10000)); -- Ensuite comme tu ne sais pas combien de ligne tu vas renvoyer tu crées une table PL/SQL de l'objet que tu as défini juste avant. TYPE type_table IS TABLE OF type_record INDEX BY BINARY_INTEGER;
Maintenant ta fonction pourra renvoyer le nouvel objet défini dans les spécs du package comme suit
Pour le remplir
Code : Sélectionner tout - Visualiser dans une fenêtre à part FUNCTION test (...Args) RETURN type_table...
tu crées un objet de ce type
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 v_test type_table -- on le rempli FOR i in 1..10 LOOP v_test(i).nom:='NOM'||i; v_test(i).link:='LINK'||i; END LOOP;
tu peut utiliser la notion du curseur...
Le mot "record" n'a pas l'air d'etre reconnu dans 8i ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 --Tu veux renvoyer X fois les informations nom, et link -- Donc tu crées un record qui correspond aux 2 infos TYPE type_record IS RECORD( nom VARCHAR2(50), link VARCHAR2(10000)); -- Ensuite comme tu ne sais pas combien de ligne tu vas renvoyer tu crées une table PL/SQL de l'objet que tu as défini juste avant. TYPE type_table IS TABLE OF type_record INDEX BY BINARY_INTEGER;
Si si
c'est dans la docs officielles, par contre tu l'as peut etre pas déclaré au bon endroit.
http://download-west.oracle.com/docs...colls.htm#7543
C'est le lien vers la doc officielle
je suis désolé mais je n'arrive pas à rentrer dans la logique du fonctionnement.
voici mon code qui me fait plein d'erreur :
si vous pouvez continué à me guider![]()
merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 declare TYPE Definition IS RECORD ( word VARCHAR2(20) ); TYPE Dictionary IS TABLE OF Definition INDEX BY BINARY_INTEGER; FUNCTION montest RETURN Dictionary IS CURSOR recs_source IS select name from dtree connect by parentid = prior dataid start with dataid = intpSource; bren Dictionary; monname varchar2(50); i integer; BEGIN open recs_source; i :=0; LOOP FETCH recs_source INTO monname; EXIT WHEN recs_source%NOTFOUND; bren(i).word := monname; i:=i+1; END LOOP; CLOSE recs_source; end; begin end;
Voici une version avec un bug en moi (mais ca ne fonctionne toujours pas![]()
)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 declare TYPE Definition IS RECORD ( word VARCHAR2(20) ); TYPE Dictionary IS TABLE OF Definition INDEX BY BINARY_INTEGER; FUNCTION montest RETURN Dictionary IS CURSOR recs_source IS select name from dtree; bren Dictionary; monname varchar2(50); i integer; BEGIN open recs_source; i :=0; LOOP FETCH recs_source INTO monname; EXIT WHEN recs_source%NOTFOUND; bren(i).word := monname; i:=i+1; END LOOP; CLOSE recs_source; end; begin end;
Oula
OKi je te propose de faire cela dans un package pour simplifier le tout
Ensuite pour execute ta fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 CREATE OR REPLACE PACKAGE test IS TYPE definition IS RECORD( word VARCHAR2(20)); TYPE dictionary IS TABLE OF definition INDEX BY BINARY_INTEGER; FUNCTION montest RETURN dictionary; END; / CREATE OR REPLACE PACKAGE BODY test IS FUNCTION montest RETURN dictionary IS CURSOR recs_source IS SELECT NAME FROM dtree CONNECT BY parentid = PRIOR dataid START WITH dataid = intpsource; bren dictionary; monname VARCHAR2(50); i INTEGER; BEGIN OPEN recs_source; i := 0; LOOP FETCH recs_source INTO monname; EXIT WHEN recs_source%NOTFOUND; bren(i) .word := monname; i := i + 1; END LOOP; CLOSE recs_source; RETURN recs_source; END; END; /
il suffira de mettre dans to code PL/SQL appelant
test.montest à la place de montest
Si le record n'a qu'une seule colonne tu peux t'en passer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 declare TYPE Dictionary IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; FUNCTION montest RETURN Dictionary IS CURSOR recs_source IS select name from dtree connect by parentid = prior dataid start with dataid = intpSource; bren Dictionary; monname varchar2(50); i integer; BEGIN open recs_source; i :=0; LOOP FETCH recs_source INTO monname; EXIT WHEN recs_source%NOTFOUND; bren(i).word := monname; i:=i+1; END LOOP; CLOSE recs_source; end; begin end;
Tout d'abord, votre fonction ne retourne rien, ce qui est ennuyeux pour une fonction...
Pour faire simple, une table composée de colonnes de type VARCHAR2(20) sera suffisante. Je ne vois pas l'interet d'un record composé d'un seul champs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Declare TYPE MON_TYPE IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER ; table_rec MON_TYPE ; Function Ma_fonction ( ...... ) RETURN MON_TYPE IS Declare tab_rec MON_TYPE ; Begin OPEN C For 'Select ma_colonne From ma_table' ; FETCH C BULK COLLECT Into tab_rec ; CLOSE C ; RETURN tab_rec ; End ; ... Begin .... -- appel fonction -- table_rec := Ma_fonction(...) . .... End ;
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
C'est impecable, ca fonctionnemerci à tous
Un autre point :
comment recuperer la structure de ma table ?
Ce que je veux c'est executer un "select ...." qui me retourne x lignes, chaque ligne corespondant au nom d' une colonne de ma table
merci
alors tu trouveras ton bonheurs dans les vues
USER_TABLES et USER_TAB_COLUMNS
J'ai rien a dire a part mercipour la qualité et la rapidité des reponses
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager