【问题标题】:Oracle - How handling function error and return null insteadOracle - 如何处理函数错误并返回 null
【发布时间】:2021-08-19 08:57:25
【问题描述】:

如何处理函数中的错误并返回null而不是任何错误?

简单示例:

create or replace Function MY_FUNC
( 
     p_par IN number
)
RETURN varchar2
IS
BEGIN
     return (Select name from my_table where id = p_par);
END;
    
    
    
    
create or replace Function MY_FUNC
( 
    p_year IN number,
    p_month IN number,
    p_day IN number
)
RETURN varchar2
IS
  v_return varchar2(100);
BEGIN
     Select to_char(p_day)||''||substr(to_char(TO_DATE(p_year || '-' || p_month || '-' || p_day, 'YYYY-MM-DD'),'DY'),0,1) into v_return from dual;
     return v_return;
END;

Select MY_FUNC(2021,6,30) from dual; --OK
Select MY_FUNC(2021,6,31) from dual; --Need catch error

如果表中没有记录,则返回 null,或者在 ORA-01839 上返回 null:日期对于任何指定的月份都无效。

【问题讨论】:

  • 日期从何而来? p_par 是一个数字,我假设 id 是一个数字,name 大概是一个 varchar2
  • @JustinCave 在上面的示例函数中返回 varchar2,在其他函数中我得到错误(日期对月份无效)。

标签: sql oracle function plsql


【解决方案1】:

您可以使用 EXCEPTION 关键字。

NO_DATA_FOUND 是异常类型。 如果您不知道类型,您可以使用 OTHERS 关键字。

编辑(感谢贾斯汀)
当然,您必须将其存储在变量中。
返回结果。

create or replace Function MY_FUNC
   ( 
     p_par IN number
   )
   RETURN varchar2
IS
    l_result varchar2;
BEGIN
     Select name into l_result from my_table where id = p_par;
     return l_result;
EXCEPTION
     WHEN NO_DATA_FOUND THEN
        RETURN NULL;
END;

【讨论】:

  • 您不能返回这样的select 语句的结果。您需要将 select 值转换为局部变量并返回。
【解决方案2】:

我的猜测是你想要这样的东西来捕获no_data_found 异常

create or replace Function MY_FUNC
 ( 
   p_par IN my_table.id%type
 )
 RETURN my_table.name%type
IS
  l_name my_table.name%type;
BEGIN
  begin
    select name
      into l_name
      from my_table
     where id = p_par;
  exception
    when no_data_found
    then
      l_name := null;
  end;

  return l_name;
END;

我不确定“ORA-01839: date not valid for month”错误可能来自哪里,因为您的代码中没有明显的日期。但是,您可以使用与我在此处捕获 no_data_found 异常相同的方式捕获代码中其他语句的其他异常。

create or replace Function MY_FUNC
( 
    p_year IN number,
    p_month IN number,
    p_day IN number
)
RETURN varchar2
IS
  v_return varchar2(100);
 
  invalid_date exception;
  pragma exception_init( invalid_date, -01839 );
BEGIN
  begin
   Select to_char(p_day) || '' ||
          substr(to_char(TO_DATE(p_year || '-' || p_month || '-' || p_day, 
                                 'YYYY-MM-DD'),
                         'DY'),
                  0,
                  1) 
      into v_return 
      from dual;
  exception
    when invalid_date
    then
      v_return := null;
  end; 

  return v_return;
END;

不过,在这种特定情况下,您可以简化逻辑(假设您使用的是 12.2 或更高版本)

create or replace Function MY_FUNC
( 
    p_year IN number,
    p_month IN number,
    p_day IN number
)
RETURN varchar2
IS
  v_return varchar2(100);
  v_dt     date;  
BEGIN
  v_dt := to_date( p_year || '-' || p_month || '-' || p_day default null on conversion error,
                   'YYYY-MM-DD' );
  if( v_dt is null )
  then
    v_return := null;
  else
    v_return := to_char(p_day) || 
                  substr( to_char(v_dt, 'DY' ),
                          0,
                          1 );
  end if;

  return v_return;
END;

【讨论】:

  • 您好,我正在更新我的问题。我收到错误 ORA-01839 的其他示例
  • @user_odoo - 已更新。
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多