Сначала давайте обсудим, что не вызывает ошибку, но то, что до сих пор не так в вашем коде :)
Вы присваивающей буквальным, который является строкой, к переменной, объявленной как дата:
bday date not null := '13-sep-78';
Но вы полагаетесь на Oracle, чтобы делать кастинг, что является проблемой, если строка отличается от вашей маски по умолчанию. Часто Oracle может определить маску даты и обрабатывать преобразование неявно. Иногда нет, и в этом случае это может привести к ошибке ORA-01843: not a valid month
или аналогичному исключению. Небезопасно полагаться на неявное литье Oracle. Всегда, всегда будет явно преобразования типов данных:
bday date not null := to_date('13-sep-1978', 'dd-mon-yyyy');
Кроме того, это плохая практика, чтобы использовать две цифры года, так как Oracle будет по умолчанию это к чему-то вы не ожидали, как 0078. Всегда включают век, это спасет вас от мира боли.
Фактическая причина ошибки
Однако, фактическая линия, которая бросает исключение это одно:
bday := NULL ;
ORA-06550
это ошибка компиляции. NULL - это не строка или что-то еще, поэтому Oracle не может даже попытаться применить ее к дате. Код не компилируется, поэтому он не запускается, и нет способа справиться с этим, кроме как путем исправления ошибки. Как только вы это сделаете, вы получите следующую ошибку. :)
SQL> declare
2 bday date not null := date '2016-09-11';
3 begin
4 bday := to_date(null);
5 end;
6/
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 4
Это одна ошибка времени выполнения, брошенной присвоение NULL для переменной, объявленной в not null
. Чтобы обработать ошибку изящно, вам нужен обработчик исключений. Самая основная для вашей цели - это ...
declare
bday date not null := '13-sep-78';
begin
bday := '12-oct-09';
bday := to_date(null);
exception
when others then
DBMS_OUTPUT.PUT_LINE('bday = ['||to_char(bday)||']');
end;
... но вам нужно что-то лучше в реальной жизни.
Примечание: Запустите вышеуказанный код и посмотрите, какое значение показывает обработчик исключений для BDAY. Значение может быть неожиданным, что подчеркивает, почему реальный код нуждается в лучшей исключительной обработке (т. Е. Более подробной информации, более контекстной информации).
''12 -oct-09'' не является' date', это 'varchar' – SomeJavaGuy