对变量c sys refcursor的无效引用

时间:2018-11-21 09:49:19

标签: plsql

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列:   声明被忽略

1 个答案:

答案 0 :(得分:0)

如果目标是列出所有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;
/