这个问题提出了一个非常有趣的观点;Oracle 文档中似乎存在关于%NOTFOUND
获取后是否可能为空的矛盾。是吗?
引用11g 文档
注意:在示例 6-16 中,如果 FETCH 从不获取行,则 c1%NOTFOUND 始终为 NULL,并且永远不会退出循环。为防止无限循环,请改用此 EXIT 语句:EXIT WHEN c1%NOTFOUND OR (c1%NOTFOUND IS NULL);
该文档似乎直接自相矛盾,因为它还说了以下内容,这意味着在 fetch 之后%NOTFOUND
不能为空。
%NOTFOUND(与 %FOUND 的逻辑相反)返回:
NULL 在打开显式游标之后但在第一次获取之前
FALSE 如果从显式游标的最新获取返回一行 返回
TRUE 否则
10g 文档有一个类似的警告,这不一定是直接矛盾,因为它警告可能无法成功执行获取以显示此行为。
在第一次提取之前,%NOTFOUND 的计算结果为 NULL。如果 FETCH 从未成功执行,则 EXIT WHEN 条件永远不会为 TRUE,并且循环永远不会退出。为了安全起见,您可能希望改用以下 EXIT 语句:
当 c1%NOTFOUND 或 c1%NOTFOUND 为空时退出;
在什么情况下 fetch 可能“失败”或%NOTFOUND
在 fetch 执行后可能返回 null?