oracle显式游标使用的实际生活示例

时间:2016-07-21 03:08:56

标签: oracle plsql

我无法想到在PL / SQL代码中使用显式游标的实际情况。任何人都可以分享一些场景吗?谢谢!

2 个答案:

答案 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非常聪明)。但是当我们需要控制程序的行为时,我们应该使用显式游标。