第一种:loop
--定义CURSOR数据结构,用的SC表结构
CURSOR TMPCURSOR IS
SELECT SNO,CNO,GRADE FROM SC;
V_SNO SC.SNO%TYPE; -- 仅使用某个字段
V_CNO SC.CNO%TYPE;
R TMPCURSOR%ROWTYPE; -- 一行数据
BEGIN
--V_CURSOR是接收到的CURSOR数据源,结构同上
LOOP
FETCH V_CURSOR INTO R;
EXIT WHEN V_CURSOR%NOTFOUND;--紧跟FETCH之后
--下边可以直接使用R这行数据,与for循环相同
END LOOP;
LOOP
FETCH V_CURSOR INTO V_SNO,V_CNO,V_GRADE;
EXIT WHEN V_CURSOR%NOTFOUND;--紧跟FETCH之后
--下边可以直接使用这几个字段
END LOOP;
END;
第二种:while
declare
cursor c1 is
select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
fetch c1 into v_sno,v_cno,v_grade;
while c1%found loop
dbms_output.put_line(v_sno||v_cno||v_grade);
fetch c1 into v_sno,v_cno,v_grade;
end loop;
close c1;
end;
第三种:for
declare
cursor c1 is
select sno,cno,grade from sc;
begin
for item in c1 loop
dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));
end loop;
end;
三种方式的比较:
1)最简单是是for循环:首先是:在declare部分不需要声明变量,其次,在begin部分不需要打开游标以及关闭游标。(推荐使用)
2)loop循环:首先要将游标指向第一行,再判断%found,需要设置循环退出条件。
3)while循环:只有第一行%found返回true时才会执行体,在循环体中执行完用户操作后,需要将游标指向下一行。
————————————————
版权声明:本文为CSDN博主「淳延」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/songxiaolingbaobao/article/details/83586123