如何在PL / SQL中关闭返回的游标?

问题描述

| 我是PL / SQL的新手,只是在学习过程中碰到了光标。我一直在看类型为“ 0”的存储过程参数,据我所知,它的目的是“返回数据”,就像C语言中的指针一样。我想知道如果程序必须打开它而不能关闭它,谁将要关闭这样的“ 1”参数呢? (如果程序将输出ѭ0关闭,则将没有任何数据可返回)。 另外,我认为,依赖于包含
OUT SYS_REFCURSOR
参数的存储过程以外的外部函数来关闭游标也是一种糟糕的设计。有没有一种方法可以在不使用游标的情况下从存储过程返回表?     

解决方法

您需要做的就是在完成操作后在游标上发出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问题。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...