Этот вопрос поднял очень интересный вопрос; кажется, что в документации Oracle есть противоречие относительно того, может ли %NOTFOUND
быть нулевым после выборки. Это?
Цитата из документации 11g
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);
Документация, по-видимому, прямо противоречит сама себе, поскольку в ней также говорится следующее, из чего следует, что после выборки%NOTFOUND
не может быть нулевым.
%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
Документация 10g содержит аналогичное предупреждение, которое не обязательно является прямым противоречием, поскольку оно предупреждает, что выборка может не выполняться успешно, чтобы такое поведение проявлялось.
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;
В каких ситуациях выборка может «сбой» или может %NOTFOUND
возвращать значение null после выполнения выборки?