在回答您的问题时,没有“默认”值。%NOTFOUND
是在打开游标时实例化的“变量”。那时的值为空;我想如果你愿意的话,你可以把它称为默认值。在第一次获取游标后,该值将是 true 还是 false,具体取决于是否返回了任何行。光标关闭后,“变量”不再存在。
引用11gr2 文档:
%NOTFOUND(与 %FOUND 的逻辑相反)返回:
NULL 在打开显式游标之后但在第一次获取之前
FALSE 如果从显式游标的最新获取返回一行 返回
TRUE 否则
10g 文档有一个有用的表格来说明这一点
+----------------+--------+--------------+
| 舞台 | 什么时候 | 返回值 |
+----------------+--------+--------------+
| 开放| 之前 | 例外 |
| | 之后 | 空 |
| 第一次提取 | 之前 | 空 |
| | 之后 | 假 |
| 下一次提取 | 之前 | 假 |
| | 之后 | 假 |
| 最后一次取货 | 之前 | 假 |
| | 之后 | 真实 |
| 关闭 | 之前 | 真实 |
| | 之后 | 例外 |
+----------------+--------+--------------+
但是,Oracle 文档中似乎存在直接的矛盾。11g 文档也有类似于您所描述的内容。其措辞似乎与上述断言直接矛盾
注意:在示例 6-16 中,如果 FETCH 从不获取行,则 c1%NOTFOUND 始终为 NULL,并且永远不会退出循环。为防止无限循环,请改用此 EXIT 语句:EXIT WHEN c1%NOTFOUND OR (c1%NOTFOUND IS NULL);
10g 文档更加明确并且措辞略有不同。这不是直接矛盾
在第一次提取之前,%NOTFOUND 的计算结果为 NULL。如果 FETCH 从未成功执行,则 EXIT WHEN 条件永远不会为 TRUE,并且循环永远不会退出。为了安全起见,您可能希望改用以下 EXIT 语句:
当 c1%NOTFOUND 或 c1%NOTFOUND 为空时退出;
一般来说,我会说信任文档并编写EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL
.
我不知道在什么情况下 fetch 不会成功执行;我问过这个问题。如果由于锁定等原因 fetch 永远不会返回值,那么您将永远无法到达代码的一部分来确定它是否失败。
René Nyffenegger在他的博客上有一些代码很好地解释了它的%NOTFOUND
工作原理。