PL / SQL VALUE_ERROR异常未在预期的位置引发

时间:2016-12-25 10:32:58

标签: oracle plsql

我确信我的问题有一个简单的理论答案,但我找不到。

我有一个程序接受NUMBER作为参数。它还有VALUE_ERROR和OTHERS例外:

create or replace procedure test( p1 number) is
begin
    null;
exception
    when VALUE_ERROR then
        RAISE_APPLICATION_ERROR(-20001, 'value_error');
    when others then
        RAISE_APPLICATION_ERROR(-20000, 'others');
end;

我正在使用VARCHAR2参数执行该过程:

execute test('a');

...我希望显示的错误消息是

  

ORA-20001 value_error

但不幸的是,我得到了:

  

错误报告 - ORA-06502:PL / SQL:数字或值错误:字符到   数字转换错误ORA-06512:第1行   06502. 00000 - " PL / SQL:数字或值错误%s"   *原因:算术,数字,字符串,转换或约束错误              发生了。例如,如果尝试,则会发生此错误              将值NULL赋给声明为NOT NULL的变量,或者如果是              尝试将大于99的整数分配给变量              声明NUMBER(2)。   *操作:更改数据,如何操作或如何声明数据              这些值不会违反约束条件。

任何人都可以解释这个,或者分享一个链接,解释为什么我没有收到预期的错误消息?

非常感谢,

1 个答案:

答案 0 :(得分:4)

正如尼古拉斯所说,你不会得到你的消息,因为异常不是在程序内部而是在执行之前抛出。

让我们看一个例子:

create or replace procedure test( p1 number) is
begin
    null;
exception
    when VALUE_ERROR then
        RAISE_APPLICATION_ERROR(-20001, 'PROC value_error');
    when others then
        RAISE_APPLICATION_ERROR(-20000, 'PROC others');
end;
/
begin
  test('a');
exception
    when VALUE_ERROR then
        RAISE_APPLICATION_ERROR(-20001, 'OUT value_error');
    when others then
        RAISE_APPLICATION_ERROR(-20000, 'OUT others');
end;

这里发生的是您正在调用一个需要数字作为参数的过程,以便Oracle在执行匿名块期间尝试转换。您无法看到该过程中的消息,因为在进入该过程之前会抛出转换异常。

现在让我们看看如果我们改变程序会发生什么:

create or replace procedure test( p1 varchar2) is
param number;
begin
    param := p1;
exception
    when VALUE_ERROR then
        RAISE_APPLICATION_ERROR(-20001, 'PROC value_error');
    when others then
        RAISE_APPLICATION_ERROR(-20000, 'PROC others');
end;
/
begin
  test('a');
exception
    when VALUE_ERROR then
        RAISE_APPLICATION_ERROR(-20001, 'OUT value_error');
    when others then
        RAISE_APPLICATION_ERROR(-20000, 'OUT others');
end;

或者只是:

begin
  test('a');
end;

查看程序中抛出的错误。

现在程序需要在其体内编号;当执行到达该点时,它会从过程本身内抛出转换错误。