CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  基础和管理

如何当发现符合条件的记录就提前退出一个游标?

楼主yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去)2003-12-04 20:58:42 在 Oracle / 基础和管理 提问

我是定义了一个游标,当我发现游标里的某一条记录满足了要求就不往下做了,提前退出游标做下面的事。因为我做的是两层的游标,里面一层游标可能会提前退出  
  问题点数: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

相关问题

  • update的问题,如何update 符合条件的第n条记录?用where current of cursor_name只能更新当前游标所在的记录!
  • 多记录查询,要用游标吗?
  • 如果判断游标中是否有记录?
  • 如何将游标移动到最后一条记录?
  • 在DE环境下如何移动记录集的游标?
  • ==怎么判断一个游标中有没有记录?==
  • 请教:一个有关记录游标的问题。
  • 如何判断游标到了表的最后一条记录?
  • 不用游标,解析一个字段,成为多条记录.
  • 有关oracle cursor游标无记录时的操作问题?

关键词

  • 语句
  • 游标
  • vcorderno
  • cfleetno
  • carnum
  • fleetno
  • vcdriverno
  • recno
  • balancemile
  • dcbalance

得分解答快速导航

  • 帖主:yczyk
  • CoolSlob
  • Drate
  • mosaic
  • xinpingf
  • xinpingf

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo