首页 > 解决方案 > 对变量 c sys refcursor 的无效引用

问题描述

DECLARE
   c        SYS_REFCURSOR;
   lv_emp   emp%ROWTYPE;
BEGIN
   OPEN c FOR SELECT employee_id FROM emp;

   --fetch c into lv_emp;
   DBMS_OUTPUT.put_line (c.emloyee_id);
END;

第 7 行出现错误:ORA-06550:第 7 行,第 24 列:PLS-00487:对变量“C”的无效引用 ORA-06550:第 7 行,第 1 列:语句被忽略

标签: plsql

解决方案


如果目标是列出所有employee_id,您可以在REFCURSOR下面的匿名块中引用。

VARIABLE c REFCURSOR

DECLARE
BEGIN
   OPEN :c FOR SELECT empno FROM scott.emp;
END;
/
PRINT c;

匿名块中的 SYS_REFCURSOR

DECLARE
   c_cursor   SYS_REFCURSOR;    
   l_row      scott.emp%ROWTYPE;
BEGIN
   OPEN c_cursor FOR SELECT * FROM scott.emp;

   LOOP
      FETCH c_cursor INTO l_row;

      EXIT WHEN c_cursor%NOTFOUND;    
      DBMS_OUTPUT.put_line (l_row.empno || ' : ' || l_row.ename);
   END LOOP;

   CLOSE c_cursor;
END;
/

在过程中使用 SYS_REFCURSOR

程序创建

CREATE OR REPLACE PROCEDURE test_proc_cursor (c OUT SYS_REFCURSOR)
AS
BEGIN
   OPEN c FOR SELECT empno FROM scott.emp;
END test_proc_cursor;
/

执行上述程序

DECLARE
   cur       SYS_REFCURSOR;
   p_empno   VARCHAR2 (50);
BEGIN
   test_proc_cursor (c => cur);

   LOOP
      FETCH cur INTO p_empno;

      EXIT WHEN cur%NOTFOUND;
      DBMS_OUTPUT.put_line ('empno  -->' || p_empno);
   END LOOP;

   CLOSE cur;
END;
/

推荐阅读