确定何时在SQL查询或PL / SQL过程中执行函数

时间:2019-02-07 08:55:19

标签: sql oracle function plsql execution

是否有什么方法可以识别何时在SQL Query中执行pl / sql函数以及何时在过程或PL / SQL匿名块中执行? (我不想传递任何用于手动识别的参数)

我需要的主要原因是,当在SQL查询中执行函数时,我不想在失败的情况下引发异常,我只对返回值NULL感到满意。但是在pl / sql脚本中执行该函数时,我想引发异常。

谢谢。

2 个答案:

答案 0 :(得分: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 :(得分: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