首页 > 解决方案 > Oracle ORA01858 比较日期为空

问题描述

只是在我复习的时候问这个。我确定我错过了一些愚蠢的东西。我有一些 PLSQL 将日期与空值进行比较:

BEGIN
 RETURN CASE
  WHEN (i_date_one IS NULL) THEN  -- ORA01858 occurs here
   i_date_two 
  WHEN (i_date_one = c_min_date) THEN
   NULL
  ELSE
   i_date_one 
 END;

i_date_one 和 i_date_two 的表都有该列的日期类型,但偶尔会弹出错误。我怀疑这是由于桌子上根本不存在一行,但有人有任何提示吗?

标签: oracledateplsqloracle11g

解决方案


ORA-01858: 在需要数字的地方发现了一个非数字字符

如果 - 正如你所说 -i_date_one并且i_date_twoDATEs,那么他们不能提出那个错误。DATE列仅接受有效日期。

但是,如果这些是应该VARCHAR2包含日期的列,那么是的 - 它们可以包含不是有效日期的内容,例如(是字母“o”和数字“六”),它会引发. 例如:16.o6.2020o6ORA-01858

SQL> declare
  2    my_date     date;
  3    i_date_one  varchar2(20) := '16.o6.2020';
  4  begin
  5    my_date := i_date_one;
  6  end;
  7  /
end;
   *
ERROR at line 6:
ORA-01858: a non-numeric character was found where a numeric was expected
ORA-06512: at line 5


SQL>

如果是这种情况,您宁愿将日期存储到DATE数据类型列中。搜索所有可能的错误案例可能需要一些时间。


我不认为将任何东西NULL加薪进行比较ORA-01858;我认为你走错了路。

SQL> declare
  2    my_date     date;
  3    i_date_one  varchar2(20) := '16.o6.2020';
  4  begin
  5    my_date := case when i_date_one is null then sysdate
  6                    else null
  7               end;
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL>

推荐阅读