Oracle ORA01858 Сравнение даты с нулевым значением - PullRequest
0 голосов
/ 16 июня 2020

Просто спрашиваю, пока просматриваю. Я уверен, что упускаю что-то глупое. У меня есть немного PL SQL, сравнивающего дату с нулем:

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 есть тип даты для этого столбца, но иногда появляется ошибка. Я подозреваю, что это из-за того, что в таблице вообще нет строки, но у кого-нибудь есть советы?

1 Ответ

0 голосов
/ 16 июня 2020

ORA-01858: обнаружен нечисловой c символ, где ожидалось di git

Если - как вы сказали - i_date_one и i_date_two являются DATE s, то они не могут вызвать эту ошибку. Столбец DATE принимает только действительные даты.

Но, если это VARCHAR2 столбцы, которые должны содержать даты, тогда да - они могут содержать что-то, что не является допустимым date, например, 16.o6.2020 (o6 - это буква «о», а di git «шесть»), и это повысит 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. Поиск всех возможных неправильных случаев может занять некоторое время.


Я не думаю, что сравнение чего-либо с 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>
...