【问题标题】:Returning a cursor from an inner procedure to outer procedure in oracle pl/sql在 oracle pl/sql 中将游标从内部过程返回到外部过程
【发布时间】:2011-06-06 09:18:54
【问题描述】:

我正在使用 oracle PL/SQL 程序。 我在另一个过程中调用一个过程。我想将游标从嵌套过程返回到外部过程。 这可能吗? 它对程序有多大不利影响?

下面是调用结构:

  Proc1( data1 IN integer, cursor1 OUT SYS_REFCURSOR ) {

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

               }
  }

【问题讨论】:

    标签: oracle plsql cursor sys-refcursor


    【解决方案1】:

    这里是调用具有 REF CURSOR 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.
    

    在本例中,我创建了一个 SQL*Plus 替换变量 rc 来演示如何调用 p2。如果你用 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
    

    【讨论】:

    • 谢谢你。这种呼叫呼叫是否有任何性能问题。是否会对程序产生不利影响?
    • @tito - REF CUSROR 只是一个指针,因此在不同过程之间传递 REF CURSOR 的开销非常小。如果您一开始就错误地使用了 REF CURSOR,就会出现性能损失——例如,如果您正在编写嵌套循环,而不是让 Oracle 处理连接,或者您正在从 REF CURSOR 进行大量单行提取,而不是比进行 BULK COLLECT 更有可能进行优化。
    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2021-06-14
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多