8

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

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

4

1 回答 1

12

您需要做的就是在完成后在光标上发出一个 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 。

于 2011-05-25T17:29:16.793 回答