21.11.2008, 20:50

Оракловская SQL-машина и NO_DATA_FOUND

Необработанный NO_DATA_FOUND в функции приводит к тому, что любой SELECT с этой функцией вернет NULL, а не выдаст NO_DATA_FOUND! При этом та же функция в PL\SQL работает ожидаемым образом. Пример:
SQL> create or replace function no_data
   2 return number
   3 is
   4    res number := 0;
   5 begin
   6    select 1 into res from dual
   7    where 1 = 0;
   8    return res;
   9 end;
  10 /

 Функция создана.

SQL> select no_data from dual;

NO_DATA
----------


SQL> declare
   2    dummy number;
   3 begin
   4    dummy := no_data;
   5 end;
   6 /
declare
*
ошибка в строке 1: ORA-01403: no data found
ORA-06512: at "HARPER.NO_DATA", line 6
ORA-06512: at line 4
То же касается и pipelined-функций, в которых есть необработанное исключение NO_DATA_FOUND (то есть выполнение функции прервется в каком-то месте без всяких исключений, и попробуй пойми, почему функция не выдает очередную строку). Незнание этой тонкости работы SQL-машины оракла привело меня к полуторачасовому головняку (разумеется, в пятницу вечером).

Комментарии (посмотреть)
blog comments powered by Disqus