我确信我的问题有一个简单的理论答案,但我找不到。
我有一个程序接受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)。 *操作:更改数据,如何操作或如何声明数据 这些值不会违反约束条件。
任何人都可以解释这个,或者分享一个链接,解释为什么我没有收到预期的错误消息?
非常感谢,
答案 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;
查看程序中抛出的错误。
现在程序需要在其体内编号;当执行到达该点时,它会从过程本身内抛出转换错误。