我正在研究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
。
答案 0 :(得分:3)
在回答您的问题时,没有“默认”值。 %NOTFOUND
是在打开游标时实例化的“变量”。此时的值为null;如果你愿意,我猜你可以把它称为默认值。在第一次获取游标之后,该值将为true,具体取决于是否返回任何行。光标关闭后,“变量”不再存在。
%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
的工作原理。