当在SQL查询或PL / SQL程序中执行的功能识别

问题描述 投票:2回答:2

有什么办法当SQL查询执行的PL / SQL函数和过程或PL / SQL匿名块被执行时鉴别? (我并不想通过人工识别的任何参数)

主要的原因我需要的是当一个SQL查询执行的功能我不喜欢失败的情况下引发异常,我会满足于只用返回NULL值。但在PL / SQL脚本执行时同样的功能我想引发异常。

先感谢您。

sql oracle function plsql execution
2个回答
1
投票

你为什么不添加参数的功能指示是否抛出异常/返回null?当你调用函数你可以选择你需要的行为。

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;

当然:Hiding all errors is bad practise


1
投票

好了,环顾四周,我发现有一个黑客可用:

当你调用在SQL PL / SQL异常NO_DATA_FOUND不会传播。所以,你可以用它来“返回null”,而不是从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
© www.soinside.com 2019 - 2024. All rights reserved.