2011-01-10 3 views
2

oracle PL/SQL 프로 시저를 사용하고 있습니다. 하나의 프로 시저를 다른 프로 시저에 호출합니다. 중첩 된 프로 시저에서 외부 프로 시저로 커서를 반환하고 싶습니다. 이것이 가능합니까? 절차에 어떤 영향이 있습니까?oracle pl/sql에서 내부 프로 시저에서 외부 프로 시저로 커서 이동

Proc1(data1 IN integer, cursor1 OUT SYS_REFCURSOR) { 

       Proc2(data2 IN , cursor1 out) { 
         open cursor1 FOR 
       select * from table; 

       } 
    } 

답변

5

여기 파라미터 REF 커서 OUT이 절차 호출의 일례이다

은 다음 호출 구조이다.

SQL> create or replace procedure p1(
    2 p_empno in emp.empno%type, 
    3 p_rc out sys_refcursor 
    4 ) 
    5 as 
    6 begin 
    7 open p_rc 
    8  for 
    9  select * 
10  from emp 
11  where empno = p_empno; 
12 end; 
13/

Procedure created. 

SQL> create or replace procedure p2(
    2 p_empno in emp.empno%type, 
    3 p_rc out sys_refcursor 
    4 ) 
    5 as 
    6 begin 
    7 p1(p_empno, p_rc); 
    8 end; 
    9/

Procedure created. 

이 경우, p2를 호출하는 방법을 보여주기 위해 SQL * Plus 대체 변수 rc를 작성합니다. SQL * Plus 이외의 다른 언어에서 호출하는 경우에는 구문이 조금씩 다르지만 일반적인 원칙은 동일합니다.

SQL> var rc refcursor; 
SQL> exec p2(7900, :rc); 

PL/SQL procedure successfully completed. 

SQL> print rc 

    EMPNO ENAME  JOB    MGR HIREDATE   SAL  COMM 
---------- ---------- --------- ---------- --------- ---------- ---------- 
    DEPTNO FAKE_COL  FOO 
---------- ---------- ---------- 
     7900 SM2  CLERK   7698 03-DEC-81  950 
     30   1 
+0

감사합니다. 이러한 종류의 전화 호출은 성능 문제가 있습니다. 절차에 악영향을 미칩니 까? – cherit

+0

@tito - REF CUSROR는 포인터 일 뿐이므로 여러 프로 시저간에 REF CURSOR를 전달하는 오버 헤드가 매우 적습니다. REF CURSOR를 잘못 사용하면 성능이 저하 될 수 있습니다. 예를 들어 중첩 루프를 작성하는 경우 오라클이 조인을 처리하는 대신 REF CURSOR에서 많은 양의 단일 행 가져 오기를 수행하는 것이 좋습니다 BULK COLLECT를 수행하는 것보다 최적화 할 가능성이 높습니다. –

관련 문제