注意:-
=========
1.只能在PL / SQL块,子程序或程序包的声明部分声明异常。
2.Exception和变量声明相似。 但是请记住,异常是错误条件,而不是数据项。 与变量不同,异常不能出现在赋值语句或SQL语句中。 但是,相同的作用域规则适用于变量和异常。
3.PL/SQL例外的范围规则
-------------------------------------------------- ---------
不能在同一块中两次声明异常。 但是可以在两个不同的块中声明相同的异常。
块中声明的异常被认为是该块本地的,而其所有子块都是全局的。 因为块只能引用局部或全局异常,所以封闭的块不能引用在子块中声明的异常。
如果在子块中重新声明全局异常,则以本地声明为准。 因此,除非在带标签的块中声明了子异常,否则子块不能引用全局异常。
4.过程RAISE_APPLICATION_ERROR可让您从存储的子程序中发出用户定义的ORA-错误消息。 这样,您可以向应用程序报告错误,并避免返回未处理的异常。
要调用RAISE_APPLICATION_ERROR,请使用以下语法
raise_application_error(error_number,message [,{TRUE | FALSE}]));
其中error_number是在-20000 .. -20999范围内的负整数,而message是一个字符串,最长为2048个字节。
如果可选的第三个参数为TRUE,则将错误放置在先前错误的堆栈中。 如果参数为FALSE(默认值),则该错误将替换所有先前的错误。
RAISE_APPLICATION_ERROR是DBMS_STANDARD程序包的一部分,并且与STANDARD程序包一样,您不需要限定对其的引用。
应用程序只能从正在执行的存储子程序(或方法)中调用raise_application_error。 调用时,raise_application_error会结束子程序,并向应用程序返回用户定义的错误号和消息。 错误号和消息可以像任何Oracle错误一样被捕获。
5.Exception OTHERS可以处理所有类型的异常,因此它必须是异常列表中的最后一个。
PRAGMA EXCEPTION_INIT
=====================
CREATE OR REPLACE PROCEDURE raiseexp IS
empty EXCEPTION; --user defined exception declared
PRAGMA EXCEPTION_INIT(empty, -01400);
--initialized to oracle defined number (this exceptionis raised when a null is inserted into afield with not null constraint)
BEGIN
INSERT INTO emp(empno) VALUES (null);
COMMIT;
EXCEPTION
WHEN empty THEN
dbms_output.put_line('ERROR: Trapped Fields Left Null');
--when the exception is raised customized message is displayed instead of oracle defined message.
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END ;
注意;-在上述过程中,用户尝试将空值输入到非空字段(EMP表的EMPNO字段)中,该字段受到限制。
From: https://bytes.com/topic/oracle/insights/655848-exceptions-4-a