【问题标题】:How to close a returning cursor in PL/SQL?如何关闭 PL/SQL 中的返回游标?
【发布时间】:2011-05-25 16:59:23
【问题描述】:

我是 PL/SQL 的新手,我在学习过程中刚刚接触过游标。我一直在看到类型为OUT SYS_REFCURSOR 的存储过程参数,据我所知,它的目的是像C 语言中的指针一样“返回数据”。我一直想知道如果程序必须打开它并且不能关闭它,谁会关闭这样的SYS_REFCURSOR 参数? (如果程序关闭了OUT SYS_REFCURSOR,则不会有任何数据返回)。

另外,我认为,依靠包含OUT SYS_REFCURSOR 参数的存储过程以外的外部函数来关闭游标是不好的设计。有没有一种方法可以在不使用游标的情况下从存储过程返回表?

【问题讨论】:

    标签: oracle plsql sys-refcursor ref-cursor


    【解决方案1】:

    您需要做的就是在完成操作后在光标上发出一个 CLOSE 指令,而不管它实际上是在哪里打开的:

    -- A function to return a SYS_REFCURSOR
    CREATE OR REPLACE FUNCTION f_c RETURN SYS_REFCURSOR IS
        cur SYS_REFCURSOR;
    BEGIN
        OPEN cur FOR SELECT LEVEL FROM dual CONNECT BY LEVEL < 10;
        RETURN cur; 
    END;
    

    这是一个示例运行:

    DECLARE
      cc SYS_REFCURSOR;
      r  VARCHAR2(10);
    BEGIN
      cc := f_c;         -- Get the cursor from the function
      LOOP
        FETCH cc INTO r;
        EXIT WHEN cc%NOTFOUND;
        dbms_output.put_line('Output is: '||r);
      END LOOP;
      CLOSE cc;          -- Close the SYS_REFCURSOR returned from the function
    END;
    /
    
    Output is: 1
    Output is: 2
    Output is: 3
    Output is: 4
    Output is: 5
    Output is: 6
    Output is: 7
    Output is: 8
    Output is: 9
    

    关于从函数或过程返回一组值,这里有另一个SO question 讨论这个主题。

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多