This question raised a very interesting point; there seems to be a contradiction in the Oracle documentation on whether it's possible for %NOTFOUND
to be null after a fetch. Is it?
To quote from the 11g documentation
Note: In Example 6-16, if FETCH never fetches a row, then c1%NOTFOUND
is always NULL and the loop is never exited. To prevent infinite
looping, use this EXIT statement instead: EXIT WHEN c1%NOTFOUND OR
(c1%NOTFOUND IS NULL);
The documentation seems to directly contradict itself as it also says the following, which implies that after a fetch %NOTFOUND
cannot be null.
%NOTFOUND (the logical opposite of %FOUND) returns:
NULL after the explicit cursor is opened but before the first fetch
FALSE if the most recent fetch from the explicit cursor returned a row
TRUE otherwise
The 10g documentation has a similar warning, which isn't, necessarily, a direct contradiction as it warns that a fetch might not execute successfully in order for this behaviour to be exhibited.
Before the first fetch, %NOTFOUND evaluates to NULL. If FETCH never
executes successfully, the EXIT WHEN condition is never TRUE and the
loop is never exited. To be safe, you might want to use the following
EXIT statement instead:
EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;
In what situations might a fetch either "fail" or might %NOTFOUND
return null after a fetch has been executed?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…