У меня есть курсор, который используется для получения предварительной информации для другой обработки. Возможно, что запрос, поддерживающий курсор, может не возвращать какие-либо строки, и в этих редких случаях мы хотим вызвать специальное исключение (обрабатываемое и регистрируемое в другом месте, чтобы обработка не прекращалась принудительно), чтобы пользователь знал, что наиболее вероятно плохой ввод. Вот как это выглядит:
open c_getPrs(in_pnum);
loop
fetch c_getPrs
into r_rpmRecord;
if c_getPrs%NOTFOUND then
raise X_INVALID_PNUM;
end if;
exit when c_getPrs%rowcount > 1 /*or c_getPrs%NOTFOUND*/;
end loop;
close c_getPrs;
Проблема в том, что оператор if выполняется ВСЕГДА, поэтому исключение всегда возникает, даже когда возвращается строка. Не знаю почему. Если есть лучший способ справиться с такой логикой, я тоже открыт для этого;)
%rowcount
ведет себя не так, как вы думаете, и цикл выполняется более одного раза? - person Adam Hawkes   schedule 10.11.2009