【问题标题】:Oracle ORA01858 Comparing Date to NullOracle ORA01858 比较日期为空
【发布时间】:2020-10-06 07:22:54
【问题描述】:

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

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

【问题讨论】:

  • 请添加更多代码,不清楚您的问题是什么。您谈论表格并仅显示函数体的一部分。

标签: oracle date plsql oracle11g


【解决方案1】:

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

如果 - 正如你所说 - i_date_onei_date_twoDATEs,那么它们就不会引发该错误。 DATE 列仅接受有效日期。

但是,如果这些VARCHAR2应该包含日期,那么是的 - 它们可以包含不是有效日期的内容,例如16.o6.2020 (o6是字母“o”和数字“六”),它将引发ORA-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 数据类型列中。搜索所有可能的错误案例可能需要一些时间。


我不认为将 anythingNULL 进行比较会引发 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2012-04-28
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多