首页 > oracle存储过程中遍历的疑惑

oracle存储过程中遍历的疑惑

此前很少使用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;

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


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

【热门文章】
【热门文章】