2012-06-30 79 views
1

我正在學習PL/SQL遊標。我有一個遊標屬性的問題。隱式和顯式遊標中%FOUND%NOTFOUND的默認值是多少?cusor屬性中%NOTFOUND的默認值是什麼?

我通過PDF去,我發現這句話

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

的第一次提取,%NOTFOUND計算爲NULL之前。因此,如果FETCH從未成功執行,則永遠不會退出循環。這是因爲只有當WHEN條件爲 時,EXIT WHEN語句纔會執行。爲了安全起見,請使用以下EXIT語句代替:

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

如果遊標未打開,與%NOTFOUND引用它提出INVALID_CURSOR

回答

3

在回答你的問題時,沒有「默認」值。 %NOTFOUND是在遊標打開時實例化的「變量」。該點的值爲空;我想你可以把這稱爲默認,如果你想。在第一次獲取遊標後,根據是否返回任何行,該值將爲true或false。遊標關閉後,「變量」不再存在。

要引用11gr2 documentation

%NOTFOUND(佔發現邏輯對面)返回:在顯式遊標後
NULL被打開,但之前的第一次提取
FALSE如果最近的取從顯式遊標返回的行
TRUE否則

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當c1%NOTFOUND或 (c1%NOTFOUND IS NULL);

10g documentation更明確,措辭略有不同。這不是直接的矛盾

在第一次提取之前,%NOTFOUND的計算結果爲NULL。如果FETCH從不成功執行 ,EXIT WHEN條件永不爲TRUE,並且永不退出循環。爲了安全起見,您可能需要使用以下 EXIT語句:

退出時c1%NOTFOUND或c1%NOTFOUND爲NULL;

一般而言,我會說,信任文檔和編寫EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL是明智的。

我不知道在什麼情況下fetch不會成功執行; I've asked the question。如果由於鎖定等原因永遠不會返回值,那麼您將永遠無法到達代碼的一部分以確定它是否失敗。

René Nyffenegger在他的博客一些代碼是如何%NOTFOUND工作的一個很好的解釋。

相關問題