日期:2014-05-17  浏览次数:21111 次

游标变量可以使用游标FOR循环处理数据吗?
--游标变量使用普通for循环输出
SET SERVEROUTPUT ON
DECLARE
  TYPE emp_cur IS REF CURSOR;
  v_emp_cur emp_cur;
  v_emp_record t_myemp%ROWTYPE;
BEGIN
  IF NOT v_emp_cur%ISOPEN THEN
    OPEN v_emp_cur FOR SELECT *FROM t_myemp;
  END IF;
  DBMS_OUTPUT.PUT_LINE('员工ID 姓名 职位 上级ID 生日 工资 奖金 部门ID');
  
  LOOP
    FETCH v_emp_cur INTO v_emp_record;
    EXIT WHEN v_emp_cur%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE(v_emp_record.empno||'  '||v_emp_record.ename||'  '||v_emp_record.job||'  '||v_emp_record.mgr
      ||'  '||v_emp_record.hiredate||'  '||v_emp_record.sal||'  '||v_emp_record.comm||'  '||v_emp_record.deptno);
  END LOOP;
  CLOSE v_emp_cur;
END;
/
--这里没有问题,但是如果用游标for循环的话:
SET SERVEROUTPUT ON
DECLARE
  TYPE emp_cur IS REF CURSOR;
  v_emp_cur emp_cur;
  v_emp_record t_myemp%ROWTYPE;
BEGIN
  IF NOT v_emp_cur%ISOPEN THEN
    OPEN v_emp_cur FOR SELECT *FROM t_myemp;
  END IF;
  DBMS_OUTPUT.PUT_LINE('员工ID 姓名 职位 上级ID 生日 工资 奖金 部门ID');
  FOR v_emp_record IN v_emp_cur  LOOP
    DBMS_OUTPUT.PUT_LINE(v_emp_record.empno||" "||v_emp_record.ename||"  "||v_emp_record.job||"  "||v_emp_record.mgr
    ||"  "||v_emp_record.hiredate||"  "||v_emp_record.sal||"  "||v_emp_record.comm||"  "||v_emp_record.deptno);
  END LOOP;
END;
/
就会报错:
ORA-06550: 第 10 行, 第 23 列: 
PLS-00221: 'V_EMP_CUR' 不是过程或尚未定义
ORA-06550: 第 10 行, 第 3 列: 
PL/SQL: Statement ignored

请问是根本不能这样使用还是我写错了?
oracle pl/sql cursor

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

如果你想在FOR循环中使用游标变量,需要在DECLARE中定义,

DECLARE
   T