2016-09-07 6 views
-1

Я получаю сообщение об ошибке при выполнении следующего, и я хочу, чтобы отобразить сообщение об ошибке вместо ошибки:ORA-06550 в PLSQL

declare 
    bday date not null := '13-sep-78'; 
begin 
    bday := '12-oct-09'; 
    bday := NULL ; 
    DBMS_OUTPUT.PUT_LINE(bday); 
end; 

Ошибка заключается в следующую: отчет

Ошибки -

ORA-06550: line 5, column 9: PLS-00382: expression is of wrong type
ORA-06550: line 5, column 1: PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

+2

''12 -oct-09'' не является' date', это 'varchar' – SomeJavaGuy

ответ

-1
declare 
    bday varchar2(50) not null := '13-sep-78'; 
begin 
    bday := '12-oct-09'; 
    --bday := NULL ; 
    DBMS_OUTPUT.PUT_LINE(bday); 
end; 

если вы установите BDay не нуль, то вы не можете установить его в нуль value.And BDay должен быть varchar2 или somethingels e из-за вашей ценности.

+0

Это не почему эта строка выдает * эту ошибку *. – APC

+0

Эта ошибка возникает из-за того, что ваше значение bday должно быть varchar2 для вашего значения «13 -sep-78 ». И оно должно быть установлено, потому что вы указываете его как« Не null ». Я прокомментировал bday: = NULL из-за этого. – FreeMan

+0

Nope. Oracle может обрабатывать некоторые преобразования даты неявно. В противном случае мы ожидаем увидеть сообщение «ORA-01843» или подобное сообщение об ошибке. Что вызывает конкретное сообщение об ошибке, которое видит OP, пытается нести NULL в дату неявно. 'to_date (null)' выдает другое сообщение об ошибке. См. [Мой ответ] (http://stackoverflow.com/a/39368881/146325), чтобы понять больше. – APC

3

Сначала давайте обсудим, что не вызывает ошибку, но то, что до сих пор не так в вашем коде :)

Вы присваивающей буквальным, который является строкой, к переменной, объявленной как дата:

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. Значение может быть неожиданным, что подчеркивает, почему реальный код нуждается в лучшей исключительной обработке (т. Е. Более подробной информации, более контекстной информации).

0

Это ошибка времени компиляции и должна быть исправлена ​​до фактического запуска кода.

Поскольку ваш вопрос заключается в том, как отображать сообщение вместо ошибки Oracle по умолчанию, я подозреваю, что это упражнение по обработке исключений и было сделано специально, чтобы вызвать ошибку, чтобы поймать ее, чтобы отобразить ваши собственные сообщение? Если это так, начните здесь для некоторых основ: https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm

Если нет, то дайте мне знать в комментарии, и я удалю это сообщение.