从存储过程中调用 PL/SQL 游标得到结果

Posted

技术标签:

【中文标题】从存储过程中调用 PL/SQL 游标得到结果【英文标题】:Calling PL/SQL cursor from stored procedure to get the result 【发布时间】:2016-07-05 03:51:03 【问题描述】:

这就是存储过程的样子

CREATE OR REPLACE PACKAGE TABLE.PROCEDURES IS

  type reference_cursor IS REF CURSOR;

  PROCEDURE get_attrs(output out reference_cursor) IS
  BEGIN
    OPEN output FOR
      SELECT *,
          FROM ATTRS a
         ORDER BY a.id;
  EXCEPTION
    WHEN OTHERS THEN
      RAISE;
  END get_attrs;
END PROCEDURES;
/

我想调用get_attrs存储过程,从reference_cursor类型的输出变量中获取输出。

这是我想出的,但它给了我以下错误。

DECLARE
  outputTABLE.PROCEDURES.reference_cursor;
  output_records TABLE.ATTRS%ROWTYPE;
  BEGIN TABLE.PROCEDURES.get_attrs(output);
      LOOP
        FETCH
        output INTO output_records;
        EXIT WHEN output_records%NOTFOUND;
        dbms_output.put_line(output_records.id);
      END LOOP;
  CLOSE output;
END;

还有错误

PLS-00324: cursor attribute may not be applied to non-cursor 'OUTPUT_RECORDS'

知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

消息很清楚:您正在尝试在非光标元素上使用光标特定属性:OUTPUT_RECORDS

事实上,CURSOR_RECORDS 不是游标,所以你需要检查你正在获取的游标上的%NOTFOUND,而不是你正在获取的变量:

EXIT WHEN output%NOTFOUND;

【讨论】:

【参考方案2】:

试试这个。希望对您有所帮助。

SET SQLBL ON;
SET DEFINE OFF;
DECLARE
output_tab ATTRS%ROWTYPE;
BEGIN
  TABLE.PROCEDURES.get_attrs(output);
  LOOP
    FETCH output INTO output_tab;
    EXIT
  WHEN output%NOTFOUND;
    dbms_output.put_line(output_tab.id);
  END LOOP;
  CLOSE output;
END;

【讨论】:

以上是关于从存储过程中调用 PL/SQL 游标得到结果的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 编程游标存储过程函数

PL/SQL 打印出存储过程返回的引用游标

Oracle --- 存储过程函数包游标触发器

Oracle --- 存储过程函数包游标触发器

Oracle --- 存储过程函数包游标触发器

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器