使用cursor时,用open cursor;loop...与 ...for ..in..loop... 的区别?

[复制链接]
查看11 | 回复8 | 2008-1-21 16:50:24 | 显示全部楼层 |阅读模式
请问
open cursor;

loop ...

fetch...into...

end loop;

close cursor;

for ...in...loop

fetch...into...

end loop
的区别?
今天碰到一问题,两种情况下取得的结果不一样,请帮忙找下原因?谢了!
1declare
2 vid varchar2(4);
3 i integer := 1;
4 cursor vrec is select id from personnel.personnel where id like '063%';
5begin
6--for r_rec in vrec
7open vrec;
8loop
9dbms_output.put_line(i);
10fetch vrec into vid;
11i:=i+1;
12dbms_output.put_line(vid);
13exit when vrec%notfound;
14end loop;
15close vrec;
16* end;
SQL> /
1
0630
2
0631
3
0632
4
0633
5
0634
6
0635
7
0636
8
0637
9
0638
10
0639
11
0639
PL/SQL 程序顺利完成
SQL> ed
1declare
2 vid varchar2(4);
3 i integer := 1;
4 cursor vrec is select id from personnel.personnel where id like '063%';
5begin
6for r_rec in vrec
7--open vrec;
8loop
9dbms_output.put_line(i);
10fetch vrec into vid;
11i:=i+1;
12dbms_output.put_line(vid);
13 -- exit when vrec%notfound;
14end loop;
15 -- close vrec;
16* end;
SQL> /
1
0631
2
0633
3
0635
4
0637
5
0639
PL/SQL 程序顺利完成
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
for这种里面不要再用fetch
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
这样执行:
declare
vid varchar2(4);
cursor vrec is select id from personnel.personnel where id like '063%';
begin
for r_rec in vrec loop
dbms_output.put_line(r_rec.id);
end loop;
end;
/
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
谢谢lwxxrq
青鸟初飞
结果正确
请问什么两种情况,什么时候用,完全凭自己的喜好吗?
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
在for ...in ....loop
中用
fetch into ...
怎么刚好带出的是
奇数记录呢?
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
最初由 second8 发布
[B]谢谢lwxxrq
青鸟初飞
结果正确
请问什么两种情况,什么时候用,完全凭自己的喜好吗? [/B]

呵呵,实现的功能是一样的,我比较喜欢后面这种,可读性强些,代码简单方便。
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
只是一个显示游标与一个隐式游标的问题.
显示游标用完了要关闭,隐式游标用完了不用关闭.
我认为区别就这两做.
如果还有不同,如应该就是操作方式不同吧.
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
第一个的 exit when vrec%notfound; 语句位置的原因 造成多了一条结果
第一个是 显示游标 第二个是 隐式游标
回复

使用道具 举报

千问 | 2008-1-21 16:50:24 | 显示全部楼层
这种写法本身有问题
8 loop
9 dbms_output.put_line(i);
10 fetch vrec into vid;
11 i:=i+1;
12 dbms_output.put_line(vid);
13 exit when vrec%notfound;
14 end loop;
应该在fetch后先判断是否成功取到数据,我觉得这样更好:
8 loop
10 fetch vrec into vid;
13 exit when vrec%notfound;
9 dbms_output.put_line(i);
11 i:=i+1;
12 dbms_output.put_line(vid);
14 end loop;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行