oracle存储过程中遍历的疑惑

发布于 2022-08-28 11:35:41 字数 1267 浏览 39 评论 0

此前很少使用oracle,现在进入一项目,使用的是oracle,瞬间拙计。
发现别人写的存储过程中有两种写法去遍历记录,如下:

Procedure Syn_His_Main Is
sqlStr Varchar2(2000);
Cursor cur Is
  Select *
    From Crm_Od.Syn_Data_Config a
   where a.next_exec_date < sysdate
     and a.cycletime <> 0;
Begin
    For Rec in cur Loop
      sqlStr := 'begin ' || Rec.Packagename || '.' || Rec.Procedurename ||
                '; end;';
      Execute Immediate sqlStr;
      Update Crm_Od.Syn_Data_Config a
         Set a.last_exec_date = trunc(sysdate),
             a.next_exec_date = trunc(sysdate) + a.cycletime
       where a.Syn_Conf_Id = Rec.Syn_Conf_Id;
      Commit;
    End Loop;
  Exception
    When Others Then
      Null;
  End Syn_His_Main;

------------------------------------------分割线----------------------------------------

For Rec In (Select /*+rule*/
            Distinct Dwtc.Bo_Archive_Grp_Id
              From Crm.Data_Wait_To_Center Dwtc
             Where Dwtc.Deal_Flag = 0
               And Rownum < Dealnum) Loop
  Crm.Data_Source.Synchronization_For_Complate(Rec.Bo_Archive_Grp_Id);
  Delete From Crm.Data_Wait_To_Center
   Where Bo_Archive_Grp_Id = Rec.Bo_Archive_Grp_Id;
  Commit;
End Loop;

这两种有什么不同,或者说哪一种高端一些?谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

旧时模样 2022-09-04 11:35:41

这两种遍历方式分别用到了显式和隐式游标。
他们的区别有:
1. 隐式游标所需代码更少
2. 隐式游标更快
3. 隐式游标提供了NO_DATA_FOUND 和 TOO_MANY_ROWS 这两种异常
所以相对来说使用隐式游标更方便。
参考:http://www.oracle-base.com/articles/misc/implicit-vs-explicit-cursors-in-oracle-plsql.php

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文