【问题标题】:invalid refernce to variable c sys refcursor对变量 c sys_refcursor 的无效引用
【发布时间】:2018-11-21 19:26:11
【问题描述】:
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 列: 语句被忽略

【问题讨论】:

  • 需要您注释掉的fetch 才能将值检索到dbms_output 可以处理的字符串中。它不能对 ref 游标做任何事情,而且无论如何游标都没有任何 employee_id 属性。

标签: plsql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-17
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多