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