我想使用ref cursor检索行。但得到以下错误

时间:2015-01-22 03:59:20

标签: oracle plsql oracle11g

PLS-00382:表达式类型错误

我知道有一些与for循环有关但我无法标记它。

以下是我的询问:

set serveroutput on;
cl scr();

DECLARE
    type type_cursor_emp is 
      ref cursor return emp%ROWTYPE;
    v_emp_cur1 type_cursor_emp;
    v_emp emp%ROWTYPE;

BEGIN
    open v_emp_cur1 for 
    select emp_id,emp_name from emp;

    Loop
        fetch v_emp_cur1 into v_emp;
        exit when v_emp_cur1%notfound;
        dbms_output.put_line('Emp_id = '||v_emp.emp_id ||',emp_name = '||v_emp.emp_name);

    end loop;

    close v_emp_cur1;
end;

/

2 个答案:

答案 0 :(得分:1)

OPEN游标FOR需要一个字符串,你的引用游标是强类型的,所以你必须返回一个完整的emp记录,例如:

open v_emp_cur1 for
'select * from emp';

http://docs.oracle.com/database/121/LNPLS/dynamic.htm#LNPLS629

但是,在您的情况下,不清楚为什么需要使用动态SQL。您可以使用静态查询更简单地执行此操作,无需使用引用游标:

BEGIN
  FOR v_emp IN (
    select emp_id,emp_name from emp
    ) LOOP
    dbms_output.put_line('Emp_id = '||v_emp.emp_id ||',emp_name = '||v_emp.emp_name);
  END LOOP;
END;

答案 1 :(得分:0)

您采用的方式可以简化为简单的游标循环

SQL> BEGIN
  2    FOR i IN
  3    ( SELECT empno,ename FROM emp
  4    )
  5    LOOP
  6      dbms_output.put_line('Emp_id = '||i.empno ||',emp_name = '||i.ename);
  7    END LOOP;
  8  END;
  9  /
Emp_id = 7369,emp_name = SMITH
Emp_id = 7499,emp_name = ALLEN
Emp_id = 7521,emp_name = WARD
Emp_id = 7566,emp_name = JONES
Emp_id = 7654,emp_name = MARTIN
Emp_id = 7698,emp_name = BLAKE
Emp_id = 7782,emp_name = CLARK
Emp_id = 7788,emp_name = SCOTT
Emp_id = 7839,emp_name = KING
Emp_id = 7844,emp_name = TURNER
Emp_id = 7876,emp_name = ADAMS
Emp_id = 7900,emp_name = JAMES
Emp_id = 7902,emp_name = FORD
Emp_id = 7934,emp_name = MILLER

PL/SQL procedure successfully completed.

SQL>

SQL*Plus中,您可以使用 refcursor 变量轻松完成。

SQL> var r refcursor
SQL>
SQL> BEGIN
  2    OPEN :r FOR SELECT empno,ename FROM emp;
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL> print r

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS

     EMPNO ENAME
---------- ----------
      7900 JAMES
      7902 FORD
      7934 MILLER

14 rows selected.

SQL>