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 が正常に実行されない場合、ループは終了しません。これは、WHEN 条件が真の場合にのみ EXIT WHEN ステートメントが実行されるためです。安全のために、代わりに次の EXIT ステートメントを使用してください。

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

カーソルが開いていない場合は、%NOTFOUNDraisesで参照しますINVALID_CURSOR

4

1 に答える 1

3

あなたの質問への答えとして、「デフォルト」値はありません。%NOTFOUNDカーソルを開くとインスタンス化される「変数」です。その時点での値は null です。必要に応じて、これをデフォルトと呼ぶことができると思います。カーソルの最初のフェッチの後、行が返されたかどうかに応じて、値は true または false になります。カーソルが閉じられると、「変数」は存在しなくなります。

11gr2のドキュメントから引用するには:

%NOTFOUND (%FOUND の論理的な反対) の戻り値:
明示カーソルが開かれた後、最初のフェッチの前に NULL 明示カーソル
からの最新のフェッチが行を返した場合は FALSE、
それ以外の場合は TRUE

10g のドキュメントには、これを示す便利な表があります

+----+--------------------+--------------+
| | 舞台 | いつ | 戻り値 |
+----+--------------------+--------------+
| | 開く | 前に | 例外 |
| | | | | 後 | null | null |
| | 最初のフェッチ | 前に | null | null |
| | | | | 後 | 偽 |
| | 次のフェッチ | 前に | 偽 |
| | | | | 後 | 偽 |
| | 最後のフェッチ | 前に | 偽 |
| | | | | 後 | 真 |
| | 閉じる | 前に | 真 |
| | | | | 後 | 例外 |
+----+--------------------+--------------+

ただし、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 が NULL の場合は終了します。

一般的に、ドキュメンテーションを信頼して書くのが賢明だと思いますEXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL

どのような状況でフェッチが正常に実行されないかはわかりません。私は質問をしました。ロックなどのためにフェッチが値を返さない場合、コードの一部に到達して失敗したかどうかを判断することはできません。

René Nyffeneggerは、彼のブログに、どのように機能するかをよく説明するコードをいくつか掲載してい%NOTFOUNDます。

于 2012-06-30T09:56:19.527 に答える