Определите, когда функция выполняется в запросе SQL или в процедуре PL / SQL - PullRequest
0 голосов
/ 07 февраля 2019

Есть ли способ определить, когда функция pl / sql выполняется в SQL-запросе и когда выполняется в процедуре или в анонимном блоке PL / SQL? (я не хочу передавать какой-либо параметр для ручной идентификации)

Основная причина, которая мне нужна, - это когда функция выполняется в запросе SQL, я не хотел бы вызыватьИсключение в случае сбоя, я был бы удовлетворен только с возвращенным значением NULL.Но ту же функцию, когда она выполняется в сценарии pl / sql, я хочу вызвать исключение.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Что ж, оглядываясь по сторонам, я обнаружил, что есть доступный хак:

Исключение NO_DATA_FOUND не распространяется при вызове PL / SQL в SQL.Таким образом, вы можете использовать это для «возврата нуля» вместо получения исключения при вызове из SQL:

    create or replace function f 
       return int as
    begin
       raise no_data_found;
       return 1;
    end f;
    /

    select f from dual;
    F     
        null;
    declare
        v integer;
    begin
        v := f;
    end;

Error report -
ORA-01403: no data found
0 голосов
/ 07 февраля 2019

Почему бы вам не добавить параметр в функцию, чтобы указать, следует ли генерировать исключение / возвращать ноль?Когда вы вызываете функцию, вы можете выбрать нужное вам поведение.

create or replace function do_something(p_parameter1      < some_type >
                                       ,p_raise_exception varchar2 default 'Y') return < sometype > is
begin
      --.. calculating .. .
      return result;
exception
   when others then
      if p_raise_exception is 'Y'
      then
         raise;
      else
         return null;
      end if;
end;

В качестве альтернативы owa_util предоставляет некоторые функции, которые вы можете использовать.

create or replace function do_something(p_parameter1 < some_type >) return < sometype > is
   l_owner    varchar2(100);
   l_name     varchar2(100);
   l_lineno   number;
   l_caller_t varchar2(100);
begin


   --.. calculating .. .
      return result;
exception
   when others then
      owa_util.who_called_me(l_owner, l_name, l_lineno, l_caller_t)
      -- who called me result seems empty when called from sql.
      if l_owner is not null
      then
         raise;
      else
         return null;
      end if;
end;

Конечно: Скрытие всехошибки - плохая практика

...