如何当发现符合条件的记录就提前退出一个游标?
我是定义了一个游标,当我发现游标里的某一条记录满足了要求就不往下做了,提前退出游标做下面的事。因为我做的是两层的游标,里面一层游标可能会提前退出
问题点数:50、回复次数:19Top
1 楼CoolSlob()回复于 2003-12-04 21:14:23 得分 0
阅~!
不知所云.即日~~Top
2 楼CoolSlob()回复于 2003-12-04 21:15:31 得分 5
请楼下人等酌情详答~Top
3 楼Drate(小虫(好好学习,天天向上))回复于 2003-12-04 21:21:49 得分 0
呵呵,我也阅了,找找去,唉,记性不好,真的是记不住呀Top
4 楼yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去)回复于 2003-12-04 21:36:20 得分 0
呵呵
等我学会了再告诉你哦,哥,我来了,你快出来啊Top
5 楼lilygy5(我爱oracle)回复于 2003-12-04 21:40:39 得分 0
游标应该有方法直接跳到最后一条,不就可以了吗?Top
6 楼Drate(小虫(好好学习,天天向上))回复于 2003-12-04 21:46:28 得分 5
呵呵,我碰到这样的问题,一般都是用过滤的方法的了,让他空转,转到最后一条就是了,不进行退出游标的了,好象在存储过程中没有BREAK这样的语句吧Top
7 楼htp_htp(学习-》提高-》进步)回复于 2003-12-04 22:26:23 得分 0
gotoTop
8 楼mosaic()回复于 2003-12-05 09:01:36 得分 10
goto直接跳转到一个标号:
cusor1 begin
cursor2 begin
if ... then
goto ALable;
endif;
cursor2 end
<<ALable>>
---这里可能需要null;
cursor1 end;
就行了Top
9 楼xinpingf(白开心)回复于 2003-12-05 09:40:57 得分 20
偶喜欢用
for i in cursor1 loop;
for j in cursor2 loop;
Exit; --这里用Exit可以退出1层循环
end loop;
end loop;
Top
10 楼yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去)回复于 2003-12-05 09:40:57 得分 0
谢楼上的,我试过了,可是好象不行。我把我的部分代码贴出来吧!
请大家继续支持!
while CarNum > 0 loop
open Driver_Cur;
loop
fetch Driver_Cur
into Driver_No;
RecNo := RecNo +1;
exit when Driver_Cur%notfound;
select bBalance, dcBalance into IsBalance, BalanceMile from BISet;
if IsBalance = 1 then
begin
select dcBalance, cFleetNo into DriverMile, FleetNo from BIDriver
where vcDriverNo = Driver_No;
if BalanceMile > DriverMile then
begin
insert into rgOrderDetail
(Vcorderno,iDetailNo,Cfleetno, Vcdriverno)
values
(:new.vcOrderNo,RecNo,FleetNo, Driver_No);
goto ALable;
end;
end if;
end;
else
begin
insert into rgOrderDetail
(Vcorderno, iDetailNo,Cfleetno, Vcdriverno)
values
(:new.vcOrderNo,RecNo,FleetNo, Driver_No);
goto ALable;
end;
end if;
end loop;
<<ALable>>
close Driver_Cur;
CarNum := CarNum - 1;
end loop;
Top
11 楼xinpingf(白开心)回复于 2003-12-05 09:41:45 得分 0
用Exit不行吗?Top
12 楼yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去)回复于 2003-12-05 09:41:56 得分 0
好象我的goto语句没能生效啊,请大家帮忙查查原因,谢谢了!Top
13 楼yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去)回复于 2003-12-05 09:44:35 得分 0
exit好象不行,我一开始就是用exit的!Top
14 楼xinpingf(白开心)回复于 2003-12-05 09:56:29 得分 10
我很少用Open ...fetch ... close;不太清楚
但我知道用for循环时是可以的
看看这个:
SQL> begin
2 for i in 1..9 loop
3 for j in 1..9 loop
4 dbms_output.put(to_char(i)||'*'||to_char(j)||'='||to_char(i*j)||' ');
5 if i=j then
6 exit;
7 end if;
8 end loop;
9 dbms_output.put_Line('');
10 end loop;
11 end;
12 /
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
PL/SQL 过程已成功完成。
Top
15 楼iwantsay(吵闹)回复于 2003-12-05 09:58:22 得分 0
那你可以在退出条件上加个标志位啊。
通过修改标志位退出好了。Top
16 楼xinpingf(白开心)回复于 2003-12-05 10:10:33 得分 0
while CarNum > 0 loop
open Driver_Cur;
loop
fetch Driver_Cur
into Driver_No;
RecNo := RecNo +1;
exit when Driver_Cur%notfound;
select bBalance, dcBalance into IsBalance, BalanceMile from BISet;
if IsBalance = 1 then
begin
select dcBalance, cFleetNo into DriverMile, FleetNo from BIDriver
where vcDriverNo = Driver_No;
if BalanceMile > DriverMile then
begin
insert into rgOrderDetail
(Vcorderno,iDetailNo,Cfleetno, Vcdriverno)
values
(:new.vcOrderNo,RecNo,FleetNo, Driver_No);
goto ALable;
end;
end if;
//我怀疑你的程序是否走到这里了,这里没有相应的提前结束语句
end;
else
begin
insert into rgOrderDetail
(Vcorderno, iDetailNo,Cfleetno, Vcdriverno)
values
(:new.vcOrderNo,RecNo,FleetNo, Driver_No);
goto ALable;
end;
end if;
end loop;
<<ALable>>
close Driver_Cur;
CarNum := CarNum - 1;
end loop;
Top
17 楼yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去)回复于 2003-12-05 10:21:14 得分 0
呵呵,谢谢各位,问题解决了,是我自己粗心大意,写错变量了,其实exit和goto语句都可以,我都测试通过了!Top
18 楼yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去)回复于 2003-12-05 10:23:24 得分 0
好了,10分钟后结贴,以后一定养成问题解决就结贴的好习惯,希望大家多参与我的贴子!Top
19 楼chao778899(220330)回复于 2003-12-05 10:50:05 得分 0
呵呵,Top




