2010-10-11 15 views

Répondre

5

Pas directement, non. Un SYS_REFCURSOR est un pointeur vers un résultat - la seule chose que vous pouvez faire avec cela est de récupérer les données. Vous ne pouvez pas modifier le jeu de résultats.

P_PROC2 peut extraire les données à partir de SYS_REFCURSOR, émettre des requêtes pour obtenir des données supplémentaires d'une autre table et retourner quelque chose à l'appelant. À ce stade, je préférerais transformer P_PROC2 en une fonction de table pipelined. Mais vous pouvez simplement retourner une collection avec les données modifiées. Si p_proc2 doit impérativement renvoyer un CURSEUR REF, vous pouvez récupérer les données du REF CURSOR de p_proc1 dans une table temporaire globale, puis ouvrir un nouveau curseur dans p_proc2 qui interroge cette table temporaire globale et effectue les manipulations supplémentaires que vous souhaitez. Quelque chose comme

SQL> create global temporary table tmp_emp 
    2 as 
    3 select empno, ename, deptno from emp where 1=2; 

Table created. 


SQL> create or replace procedure p1(p_cur1 out sys_refcursor) 
    2 as 
    3 begin 
    4 open p_cur1 for select * from emp; 
    5 end; 
    6/

Procedure created. 

SQL> ed 
Wrote file afiedt.buf 

    1 create or replace procedure p2(p_cur2 out sys_refcursor) 
    2 as 
    3 l_cur1 sys_refcursor; 
    4 l_rec emp%rowtype; 
    5 begin 
    6 p1(l_cur1); 
    7 loop 
    8  fetch l_cur1 into l_rec; 
    9  exit when l_cur1%notfound; 
10  insert into tmp_emp(empno, ename, deptno) values(l_rec.empno, l_rec 
ename, l_rec.deptno); 
11 end loop; 
12 open p_cur2 for 
13  select empno, ename, dname 
14  from tmp_emp, 
15    dept 
16  where dept.deptno = tmp_emp.deptno; 
17* end; 
SQL>/

Procedure created. 

SQL> variable rc refcursor; 
SQL> exec p2(:rc); 

PL/SQL procedure successfully completed. 

SQL> print rc 

    EMPNO ENAME  DNAME 
---------- ---------- -------------- 
     7839 KING  ACCOUNTING 
     7934 MILLER  ACCOUNTING 
     7782 CLARK  ACCOUNTING 
     7369 smith  RESEARCH 
     7902 FORD  RESEARCH 
     7876 ADAMS  RESEARCH 
     7788 SCOTT  RESEARCH 
     7566 JONES  RESEARCH 
     7900 JAMES  SALES 
     7499 ALLEN  SALES 
     7698 BLAKE  SALES 

    EMPNO ENAME  DNAME 
---------- ---------- -------------- 
     7654 MARTIN  SALES 
     7844 TURNER  SALES 
     7521 WARD  SALES 

14 rows selected. 
+0

Merci. Je voudrais avoir une variable du type de ligne refcursor dans p_proc2 pour contenir les données extraites du curseur ref. Pourriez-vous me donner un exemple de code? – zihaoyu

+0

@zihaoyu - Ajout d'un exemple de code –