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;
这两种有什么不同,或者说哪一种高端一些?谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这两种遍历方式分别用到了显式和隐式游标。
他们的区别有:
1. 隐式游标所需代码更少
2. 隐式游标更快
3. 隐式游标提供了NO_DATA_FOUND 和 TOO_MANY_ROWS 这两种异常
所以相对来说使用隐式游标更方便。
参考:http://www.oracle-base.com/articles/misc/implicit-vs-explicit-cursors-in-oracle-plsql.php