1

我正在研究 PL/SQL 游标。我的光标属性有问题。在隐式和显式游标中%FOUND,默认值是多少?%NOTFOUND

我正在浏览我发现这句话的PDF

LOOP
FETCH c1 INTO my_ename, my_sal, my_hiredate;
EXIT WHEN c1%NOTFOUND;
...
END LOOP;

在第一次提取之前,%NOTFOUND 的计算结果为 NULL。因此,如果 FETCH 从未成功执行,则永远不会退出循环。这是因为 EXIT WHEN 语句仅在其 WHEN 条件为真时执行。为了安全起见,请改用以下 EXIT 语句:

EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;

如果游标未打开,则使用%NOTFOUNDraises引用它INVALID_CURSOR

4

1 回答 1

3

在回答您的问题时,没有“默认”值。%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工作原理。

于 2012-06-30T09:56:19.527 回答