Y_Y*_*Y_Y 6 oracle plsql sys-refcursor ref-cursor
我是PL/SQL的新手,我在学习过程中只需要游标.我一直在看类型的存储过程参数OUT SYS_REFCURSOR,据我所知,其目的是"返回数据"就像C语言中的指针一样.我一直想知道SYS_REFCURSOR如果程序必须打开并且无法关闭它,谁将关闭此参数?(如果程序关闭,OUT SYS_REFCURSOR那么将不会返回任何数据).
另外,我认为,依赖于包含OUT SYS_REFCURSOR参数的存储过程以外的外部函数来关闭游标是不好的设计.有没有办法可以在不使用游标的情况下从存储过程返回表格?
DCo*_*kie 11
您需要做的就是在完成光标时在光标上发出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;
Run Code Online (Sandbox Code Playgroud)
这是一个示例运行:
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
Run Code Online (Sandbox Code Playgroud)
至于从函数或过程返回一组值,这里是关于该主题的另一个SO问题.