Doucement mais surement...
Le NO_DATA_NEEDED, c'est pas un soucis dans la majorite des cas. Faut pas stresser la dessus.
Je demandais l'utilisation du curseur. Si vous le fermez avant d'avoir utilise toutes les lignes, alors forcement il ne recupere pas toutes les lignes.
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 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| TMP@MINILHC >CREATE OR REPLACE FUNCTION tmp_func RETURN number_tt pipelined IS
2 begin
3 FOR i IN 1..5 loop
4 pipe row(i);
5 end loop;
6 exception when others then
7 dbms_output.put_line(SQLERRM);
8 raise;
9 end;
10 /
Function created.
Elapsed: 00:00:00.00
TMP@MINILHC >
TMP@MINILHC >create or replace package tmp_pkg is
2 type cur_Result is ref cursor ;
3 end;
4 /
Package created.
Elapsed: 00:00:00.00
TMP@MINILHC >show errors
No errors.
TMP@MINILHC >create or replace procedure tmp_proc(tmp_cv out tmp_pkg.cur_result) is
2 begin
3 open tmp_cv for select * from table(tmp_func);
4 end;
5 /
Procedure created.
Elapsed: 00:00:00.00
TMP@MINILHC >show errors
No errors.
TMP@MINILHC >
TMP@MINILHC >declare
2 l_cur tmp_pkg.cur_result;
3 a number;
4 begin
5 dbms_output.put_line('NO_DATA_NEEDED parce qu'' on ne demande qu''une seule ligne');
6 tmp_proc(l_cur);
7 fetch l_cur into a;
8 dbms_output.put_line(a);
9 close l_cur;
10
11 dbms_output.put_line('Avec un WHILE, pas de probleme de NO_DATA_NEEDED');
12 tmp_proc(l_cur);
13 loop
14 fetch l_cur into a;
15 exit when l_cur%notfound;
16 dbms_output.put_line(a);
17 end loop;
18 close l_cur;
19
20 end;
21 /
NO_DATA_NEEDED parce qu' on ne demande qu'une seule ligne
1
ORA-06548: no more rows needed
Avec un WHILE, pas de probleme de NO_DATA_NEEDED
1
2
3
4
5
PL/SQL procedure successfully completed. |
Dans le premier cas (lignes 42 a 45 et sortie ecran ligne 59 a 61), je ne vois pas tous les resultats de ma function pipelined. Mais c'est tout a fait normal, vu que je ne fais qu'un fetch et qu'apres je ferme le curseur.