我无法想到在PL / SQL代码中使用显式游标的实际情况。任何人都可以分享一些场景吗?谢谢!
答案 0 :(得分:2)
如果在程序单元中多次使用游标,则显式游标允许您对SQL进行一次编码,这有利于维护。
答案 1 :(得分:2)
显式游标有两个明确的用例。
第一个是当我们想要探测记录的存在并处理代码主流中的结果时:
open emp_cur (p_empno);
fetch emp_cur into l_emp_rec;
if emp_cur%notfound then
...
这可能比较简洁
begin
select e.* into l_emp_rec
from emp e
where e.empno = p_empno;
....
exception
when no_data_found then
...
除了其他任何事情,我们计划的其他部分可能会投掷no_data_found
?
另一种情况是我们想要使用带有LIMIT子句的批量收集(当我们进行批量收集时,几乎可以肯定我们想要使用LIMIT子句)。所以
open big_cursor;
loop
fetch big_cursor bulk collect into l_array limit 1000;
exit when l_array.count() = 0;
for idx in 1..l_array.count() loop
...
显式游标会在我们的代码中引入开销,因此它们被认为是笨重且低效的。但情况并非总是如此。实际上,如果我们使用隐式游标编写批量收集语句,Oracle会优化它以使用值为100的LIMIT子句。这不是一个错误的默认值,但可能我们可以通过更高的值获得更好的性能,1000,5000 ,甚至10000.所以我们越过LIMIT值的控件使得值得使用显式游标。
简而言之,当我们很乐意让Oracle做出控制决策时,我们应该使用隐式游标(很多时候,Oracle非常聪明)。但是当我们需要控制程序的行为时,我们应该使用显式游标。