我想使用 ref 游标检索行.但是得到以下错误



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

OPEN cursor FOR 需要一个字符串,并且您的 ref 光标是强类型的,因此您必须返回完整的emp记录,例如:

open v_emp_cur1 for
'select * from emp';

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

但是,在您的情况下,不清楚为什么需要使用动态SQL。使用静态查询可以更简单地做到这一点,从而消除了对 ref 游标的需求:

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;

你这样做的方式,它可以简化为一个简单的光标循环

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>

相关内容

最新更新