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;
/
答案 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>