如果游标属性中的%NOT FOUND,默认值是多少?

时间:2012-06-30 05:33:45

标签: sql plsql attributes cursor

我正在研究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;

如果光标未打开,则使用%NOTFOUND引用它会引发INVALID_CURSOR

1 个答案:

答案 0 :(得分:3)

在回答您的问题时,没有“默认”值。 %NOTFOUND是在打开游标时实例化的“变量”。此时的值为null;如果你愿意,我猜你可以把它称为默认值。在第一次获取游标之后,该值将为true,具体取决于是否返回任何行。光标关闭后,“变量”不再存在。

引用11gr2 documentation

  

%NOTFOUND(%FOUND的逻辑反面)返回:
  显式游标打开后但在第一次获取之前为NULL   如果最近从显式游标中获取的行返回了一行,则为FALSE   否则为

10g documentation has a useful table that demonstrates this

+----------------+--------+--------------+
|     stage      |  when  | return value |
+----------------+--------+--------------+
| open           | before | exception    |
|                | after  | null         |
| first fetch    | before | null         |
|                | after  | false        |
| next fetch(es) | before | false        |
|                | after  | false        |
| last fetch     | before | false        |
|                | after  | true         |
| close          | before | true         |
|                | after  | exception    |
+----------------+--------+--------------+

但是,Oracle文档中似乎存在直接矛盾。 11g文档也有类似于你所描述的内容。其措辞似乎与上述断言直接相矛盾

  

注意:在例6-16中,如果FETCH从不提取行,则c1%NOTFOUND   始终为NULL并且永远不会退出循环。防止无限   循环,改为使用此EXIT语句:EXIT WHEN c1%NOTFOUND OR   (c1%NOTFOUND为空);

10g documentation更明确,措辞略有不同。这不是一个直接的矛盾

  

在第一次获取之前,%NOTFOUND的计算结果为NULL。如果FETCH永远不会   执行成功后,EXIT WHEN条件永远不会为TRUE而且   循环永远不会退出。为安全起见,您可能需要使用以下内容   改为EXIT语句:

     

当c1%NOTFOUND或c1%NOTFOUND为空时退出;

总的来说,我会说信任文档并写EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL

是明智的

我不知道fetch会在什么情况下无法成功执行; I've asked the question。如果获取永远不会因锁定等而返回值,那么您将永远不会到达代码的一部分来确定它是否失败。

René Nyffenegger在他的博客上有一些代码,可以很好地解释%NOTFOUND的工作原理。