この質問は非常に興味深い点を提起しました。%NOTFOUND
フェッチ後に null になる可能性があるかどうかについて、Oracle のドキュメントに矛盾があるようです。それは...ですか?
11gのドキュメントから引用するには
注意: 例6-16では、FETCHが行をフェッチしない場合、c1%NOTFOUNDは常にNULLになり、ループは終了しません。無限ループを回避するには、代わりに次の EXIT ステートメントを使用します。 EXIT WHEN c1%NOTFOUND OR (c1%NOTFOUND IS NULL);
ドキュメントは、次のようにも述べているため、直接矛盾しているようです。これは、フェッチ後はnullに%NOTFOUND
ならないことを意味します。
%NOTFOUND (%FOUND の論理的な反対) の戻り値:
明示カーソルが開かれた後、最初のフェッチの前に NULL 明示カーソル
からの最新のフェッチが行を返した場合は FALSE、
それ以外の場合は TRUE
10gのドキュメントにも同様の警告がありますが、この動作が発生するためにフェッチが正常に実行されない可能性があることを警告しているため、必ずしも直接矛盾するわけではありません。
最初のフェッチの前に、%NOTFOUND は NULL と評価されます。FETCH が正常に実行されない場合、EXIT WHEN 条件が TRUE になることはなく、ループは終了しません。安全のために、代わりに次の EXIT ステートメントを使用することをお勧めします。
c1%NOTFOUND または c1%NOTFOUND が NULL の場合は終了します。
フェッチが「失敗」したり%NOTFOUND
、フェッチの実行後に null が返されたりするのはどのような状況ですか?