游标变量可以使用游标FOR循环处理数据吗?

西蒙海耶 2013-11-21 04:27:28
--游标变量使用普通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

请问是根本不能这样使用还是我写错了?
...全文
384 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
forgetsam 2013-11-23
  • 打赏
  • 举报
回复
for c in (select ..) loop -- 用c.字段/别名 直接取得当前行的某字段/别名的值 end loop; c 不需要声明 游标不需要声明 不需要打开 不需要关闭 这叫做隐式调用。
CT_LXL 2013-11-21
  • 打赏
  • 举报
回复
引用 6 楼 u012487108 的回复:
[quote=引用 4 楼 zlloct 的回复:] [quote=引用 3 楼 u012487108 的回复:] [quote=引用 2 楼 zlloct 的回复:] 如果你想在FOR循环中使用游标变量,需要在DECLARE中定义,
DECLARE
   TYPE emp_cur IS REF CURSOR;
   v_emp_cur emp_cur;
   v_emp_record t_myemp%ROWTYPE;
这里不是定义了吗?[/quote] 我的意思是在定义的时候进行初始化,比如: CURSOR CR IS SELELCT * FROM TEST. 还有一点是用FOR循环不需要再打开游标,[/quote] 能给出详细的格式吗?
DECLARE
   TYPE emp_cur IS REF CURSOR;
   v_emp_cur emp_cur;
   v_emp_record t_myemp%ROWTYPE;
   CURSOR v_emp_cur IS SELECT *FROM t_myemp;
这样的方式会报: PLS-00305: 'V_EMP_CUR' 的前一次使用 (在第 3 行) 与此次使用发生冲突[/quote] CURSOR v_emp_cur IS SELECT *FROM t_myemp;这种方式其实就是定义一个V_EMP_CUR的游标。之所以报错其实是因为 v_emp_cur emp_cur又定义了一个游标,所以会报错,因为你定义了两个同名的游标
西蒙海耶 2013-11-21
  • 打赏
  • 举报
回复
引用 4 楼 zlloct 的回复:
[quote=引用 3 楼 u012487108 的回复:] [quote=引用 2 楼 zlloct 的回复:] 如果你想在FOR循环中使用游标变量,需要在DECLARE中定义,
DECLARE
   TYPE emp_cur IS REF CURSOR;
   v_emp_cur emp_cur;
   v_emp_record t_myemp%ROWTYPE;
这里不是定义了吗?[/quote] 我的意思是在定义的时候进行初始化,比如: CURSOR CR IS SELELCT * FROM TEST. 还有一点是用FOR循环不需要再打开游标,[/quote] 能给出详细的格式吗?
DECLARE
   TYPE emp_cur IS REF CURSOR;
   v_emp_cur emp_cur;
   v_emp_record t_myemp%ROWTYPE;
   CURSOR v_emp_cur IS SELECT *FROM t_myemp;
这样的方式会报: PLS-00305: 'V_EMP_CUR' 的前一次使用 (在第 3 行) 与此次使用发生冲突
  • 打赏
  • 举报
回复
ref cursor是动态游标的关系、 假如声明变成

declare
   CURSOR v_emp_cur is  SELECT *FROM t_myemp;
  begin
  ...
...
还有1楼的for的另一种方式,

BEGIN
  FOR V_EMP_RECORD IN (SELECT * FROM tgp_funds) LOOP
    DBMS_OUTPUT.PUT_LINE(V_EMP_RECORD.FND_ID);
  END LOOP;
END;
这种方式是建立隐式游标!
CT_LXL 2013-11-21
  • 打赏
  • 举报
回复
引用 3 楼 u012487108 的回复:
[quote=引用 2 楼 zlloct 的回复:] 如果你想在FOR循环中使用游标变量,需要在DECLARE中定义,
DECLARE
   TYPE emp_cur IS REF CURSOR;
   v_emp_cur emp_cur;
   v_emp_record t_myemp%ROWTYPE;
这里不是定义了吗?[/quote] 我的意思是在定义的时候进行初始化,比如: CURSOR CR IS SELELCT * FROM TEST. 还有一点是用FOR循环不需要再打开游标,
西蒙海耶 2013-11-21
  • 打赏
  • 举报
回复
引用 2 楼 zlloct 的回复:
如果你想在FOR循环中使用游标变量,需要在DECLARE中定义,
DECLARE
   TYPE emp_cur IS REF CURSOR;
   v_emp_cur emp_cur;
   v_emp_record t_myemp%ROWTYPE;
这里不是定义了吗?
CT_LXL 2013-11-21
  • 打赏
  • 举报
回复
如果你想在FOR循环中使用游标变量,需要在DECLARE中定义,
CT_LXL 2013-11-21
  • 打赏
  • 举报
回复
FOR 循环更简单,不用定义和打开游标,直接使用 For example: DECLARE
BEGIN
  FOR V_EMP_RECORD IN (SELECT * FROM tgp_funds) LOOP
    DBMS_OUTPUT.PUT_LINE(V_EMP_RECORD.FND_ID);
  END LOOP;
END;

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧