从存储过程调用PL / SQL游标以获取结果

时间:2016-07-05 03:51:03

标签: database oracle stored-procedures plsql

这就是存储过程的样子

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'

知道我可能做错了吗?

2 个答案:

答案 0 :(得分:2)

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

实际上,CURSOR_RECORDS不是游标,因此您需要检查要获取的游标上的%NOTFOUND,而不是您要读取的变量:

EXIT WHEN output%NOTFOUND;

答案 1 :(得分:1)

试试这个。希望它有所帮助。

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;