在plsql中的ORA-06550

时间:2016-09-07 10:38:14

标签: oracle plsql

执行以下操作时出错,我想显示错误消息而不是错误:

 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编译错误   *操作:

3 个答案:

答案 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。