Bonjours,
Je cherche un moyen de populer des Tables PL/SQL et puis de les utiliser avec des commandes SQL ou de les exporter comme ref cursor et ce sans creer d'objets dans le data dictionary. Tout doit ce faire a l'interieur de "Declare" :
Jusqu'a present je ne suis pas parvenus.
J'ai essayé des variantes avec des fonction pipelined et la command "row pipe":
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
36
37
38 declare 2 TYPE TYP_TAB is table of varchar2(30) ; 3 tab TYP_TAB ; 4 v_var varchar2(30); 5 Type typ_ref is ref cursor ; 6 ref typ_ref; 7 function ff return TYP_TAB pipelined is 8 begin 9 for i in tab.first..tab.last 10 loop 11 pipe row(tab(i) ); 12 end loop; 13 return; 14 end ; 15 Begin 16 tab := TYP_TAB( 'lundi','mardi','mercredi' ) ; 17 open ref for select * from TAble(cast( tab as typ_tab) ); 18 loop 19 null ; 20 end loop; 21 dbms_output.put_line('f=' || tab(1) ); 22 dbms_output.put_line('f=' || tab(2) ); 23 dbms_output.put_line('f=' || tab(3) ); 24 end; 25 --loop 26 -- fetch ref into v_var ; 27 -- exit when ref%NOTFOUND; 28 -- dbms_output.put_line('v=' ||v_var) ; 29* --end loop; SQL> / open ref for select * from TAble(cast( tab as typ_tab) ); * ERROR at line 17: ORA-06550: line 17, column 53: PL/SQL: ORA-00902: invalid datatype ORA-06550: line 17, column 20: PL/SQL: SQL Statement ignored
Mon but ultime est de créer des anonymous blocks depuis java, de les expedier sur le serveur pour qu'il soient traités sur le serveur et de recupèrer un ref cursor en sortie sans avoir creé un objet sur le serverur.
Quelqu'un a t'il un example de transformation d'une table PL/SQL en SQL sachant que toute commande "CREATE or REPLACE" est prohibée?
Voici ma derniere tentative : ca échoue car la pseudo colonne "level" ne s'eincremente pas pour la table PL/SQL alors qu'elle s'incremente bien pour la colonne.
pas d'erreur mais pas le resultat escompte non plus
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 declare TYPE TYP_TAB is table of varchar2(100) ; tab TYP_TAB ; cpt number:=0; Begin tab := TYP_TAB( 'lundi','mardi','mercredi' ) ; cpt:=tab.last; for c in ( select level, tab(level+1) aa from dual connect by level <= cpt ) /* <=tab.last does not work here */ loop cpt:=cpt+1; dbms_output.put_line('c='||c.aa || ' level=' || to_char(c.level) ) ; end loop; dbms_output.put_line('f=' || tab(1) ); dbms_output.put_line('f=' || tab(2) ); dbms_output.put_line('f=' || tab(3) ); end; / c=lundi level=1 c=lundi level=2 c=lundi level=3 f=lundi f=mardi f=mercredi PL/SQL procedure successfully completed.![]()
Partager