Oracle 在异常类型上有一些混乱
我们可以使用用户定义的异常或使用OUT参数模式预定义的异常(其他,SQLERRM,SQLCODE)将错误消息、错误代码传递到前端,那么我们为什么使用RAISE\U应用程序错误过程呢Oracle 在异常类型上有一些混乱,oracle,plsql,Oracle,Plsql,我们可以使用用户定义的异常或使用OUT参数模式预定义的异常(其他,SQLERRM,SQLCODE)将错误消息、错误代码传递到前端,那么我们为什么使用RAISE\U应用程序错误过程呢 RAISE\u APPLICATION\u ERROR和pragmaEXCEPTION\u INIT之间有什么区别 我在谷歌上搜索了这些问题,但没有得到明确的答案——这就是为什么在这里发布的原因。用户定义的异常不会向调用应用程序提供任何消息。它只会得到一个通用的“ORA-06510:PL/SQL:unhandled
RAISE\u APPLICATION\u ERROR
和pragmaEXCEPTION\u INIT
之间有什么区别我在谷歌上搜索了这些问题,但没有得到明确的答案——这就是为什么在这里发布的原因。用户定义的异常不会向调用应用程序提供任何消息。它只会得到一个通用的“ORA-06510:PL/SQL:unhandled user-defined exception”
raise\u application\u error
用于传递描述实际问题的消息
declare
out_of_stock exception;
begin
raise out_of_stock;
end;
/
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at line 4
begin
raise_application_error(-20000, 'Cheese is out of stock');
end;
/
ERROR at line 1:
ORA-20000: Cheese is out of stock
ORA-06512: at line 2
pragma exception\u init(exception\u name,error\u code)
允许您将自己的用户定义异常与系统错误代码关联。从编程的角度来看,这可能很有用,但最终不会为调用者增加任何价值:
declare
invalid_day_of_month exception;
pragma exception_init(invalid_day_of_month, -1847);
d date;
begin
d := to_date('99-JAN-2020','DD-MON-YYYY');
exception
-- Pointless exception handler - just to demo raising a user-defined exception
when invalid_day_of_month then raise;
end;
/
ERROR at line 2:
ORA-01847: day of month must be between 1 and last day of month
ORA-06512: at line 10
ORA-06512: at line 7
通过OUT参数传递成功/失败状态通常不是一个好主意,因为过程似乎已成功完成,调用方必须读取状态以查看它是否真的成功。。这两个问题的答案是,RAISE\u APPLICATION\u ERROR
是定义要在客户端应用程序中显示的自定义错误消息的标准方法。是的,您也可以使用OUT参数、DBMS_输出或类似的东西传递自定义消息,但这些都不是标准化的,您必须在服务器端和客户端添加代码来处理它们
DECLARE
my_exception EXCEPTION;
PRAGMA EXCEPTION_INIT(my_exception, -20001);
BEGIN
raise my_exception; -- message is default "ORA-20001: "
END;
/
BEGIN
raise_application_error(-20001, 'My custom error message'); -- message is "ORA-20001: My custom error message"
END;
/
当您想要给出更有用的描述性错误消息时,这通常很有用
DECLARE
age NUMBER;
BEGIN
age := 'hello';
EXCEPTION when VALUE_ERROR then
raise_application_error(-20001, 'Age must be a number.');
END;
/
因此,我们可以准确地告诉用户问题是什么:“年龄必须是一个数字”,而不是一般的“PL/SQL:数字或值错误:字符到数字的转换错误”