执行以下操作时出错,我想显示错误消息而不是错误:
declare
bday date not null := '13-sep-78';
begin
bday := '12-oct-09';
bday := NULL ;
DBMS_OUTPUT.PUT_LINE(bday);
end;
错误如下:
错误报告 -
ORA-06550:第5行第9列:PLS-00382:表达式类型错误 ORA-06550:第5行,第1列:PL / SQL:语句被忽略
06550. 00000 - "行%s,列%s:\ n%s"
*原因:通常是PL / SQL编译错误 *操作:
答案 0 :(得分: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');
此外,使用两位数的年份是不好的做法,因为甲骨文会将其默认为您不期望的东西,例如0078.总是包括这个世纪,它将使您远离痛苦的世界。
错误的实际原因
然而,抛出异常的实际行是这一行:
bday := NULL ;
ORA-06550
是编译错误。 NULL不是字符串或其他任何东西,因此Oracle甚至无法尝试将其强制转换为日期。代码没有编译,因此它不会运行,除了通过修复bug之外没有办法处理它。完成后,您将收到下一个错误。 :)
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显示的值。该值可能是意外的,这突出了为什么真正的代码需要更好的特殊处理(即更多细节,更多上下文信息)。
答案 1 :(得分:0)
这是一个编译时错误,必须先修复才能实际运行代码。
由于您的问题是关于如何显示消息而不是默认的Oracle错误,我怀疑这是一个关于异常处理的练习,并且是故意进行的,以便导致错误练习捕获它以显示您自己的消息?如果是这样,请从这里开始了解一些基础知识:https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/errors.htm
如果没有,请在评论中告诉我,我将删除此帖。
答案 2 :(得分:-1)
declare
bday varchar2(50) not null := '13-sep-78';
begin
bday := '12-oct-09';
--bday := NULL ;
DBMS_OUTPUT.PUT_LINE(bday);
end;
如果你将bday设置为not null,那么你就不能将它设置为null值。由于你的值,bday应该是varchar2或somethingelse。