Ben*_*Ben 9 oracle plsql cursor
这个问题提出了一个非常有趣的观点 在Oracle文档中似乎存在一个矛盾,即%NOTFOUND在获取后是否可能为null.是吗?
引用11g文档
注意:在例6-16中,如果FETCH从不提取行,则c1%NOTFOUND始终为NULL,并且永远不会退出循环.要防止无限循环,请改用此EXIT语句:EXIT WHEN c1%NOTFOUND OR(c1%NOTFOUND为NULL);
文档似乎直接与自身相矛盾,因为它也说明了以下内容,这意味着在获取后%NOTFOUND 不能为空.
%NOTFOUND(%FOUND的逻辑反向)返回:
在显式游标打开之后但在第一次获取之前返回NULL
如果最近从显式游标获取的行返回一行
TRUE,否则返回FALSE
该10克文件也有类似的警告,因为它警告说,可能会取不为了成功执行这种行为将要展出这不是必然,直接的矛盾.
在第一次获取之前,%NOTFOUND计算为NULL.如果FETCH永远不会成功执行,则EXIT WHEN条件永远不会为TRUE,并且永远不会退出循环.为安全起见,您可能希望使用以下EXIT语句:
当c1%NOTFOUND或c1%NOTFOUND为空时退出;
在什么情况下,获取"失败"或者%NOTFOUND在执行获取后可能返回null?
我可以找到一个获取失败的情况:
declare
i integer;
cursor c is
select 1 / 0 from dual;
begin
open c;
begin
fetch c
into i;
exception
when others then
dbms_output.put_line('ex');
end;
if c%notfound is null then
dbms_output.put_line('null');
elsif c%notfound then
dbms_output.put_line('true');
else
dbms_output.put_line('false');
end if;
close c;
end;
Run Code Online (Sandbox Code Playgroud)
但这只会使你的问题变得更强,因为无论是10g还是11g,它都会被评估为null.
我认为让你绊倒的部分是:
如果 FETCH 从未成功执行,则 EXIT WHEN 条件永远不会为 TRUE,并且永远不会退出循环。
过去的某个地方一定有一个代码示例,如下所示:
LOOP
FETCH c1 INTO name;
EXIT WHEN c1%NOTFOUND;
-- Do stuff
END LOOP;
Run Code Online (Sandbox Code Playgroud)
给出这段代码,那么这个说法听起来是正确的。如果提取从未执行(失败),则 %NOTFOUND 将为 null。该EXIT WHEN条件不会评估为 TRUE(null 评估为 false)。那么,事实上,循环将永远持续下去。