如果在块的执行部分异常被触发,当前的块就会转去执行异常处理部分的相应异常处理机。如果PL/SQL成功处理了异常,就不会把异常传播给外部块或环境,从而,PL/SQL块正常结束。
异常的传播
如果在块的执行部分异常被触发, 然而没有相应的异常处理机,块就会异常终止,而将异常传递给调用环境。
错误引发异常,每当引发异常时,都将控制权传递给异常处理程序,异常处理程序处理异常.
捕获异常:
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
statement2;
. . .
[WHEN exception3 [OR exception4 . . .] THEN
statement1;
statement2;
. . .]
[WHEN OTHERS THEN
statement1;
statement2;
. . .]
•在异常部分WHEN子句没有数量限制
•WHEN OTHERS是最后一个子句
•异常处理部分从关键字EXCEPTION开始
•当异常抛出后,控制无条件转到异常处理部分
•在离开块之前只能执行一种异常处理
预定义异常:
预定义异常是由 Oracle 为常见错误预先定义的,不需要显式声明。
在相应的异常处理例程中引用错误的标准名来截获一个Oracle 服务器预定义错误。
例子:
DECLARE
v_sal emp.sal%type;
BEGIN
SELECT sal INTO v_sal
FROM emp
WHERE empno=999;
EXCEPTION
WHEN NO_DATA_FOUND then
dbms_output.put_line('没有查到数据');
WHEN others then
dbms_output.put_line('其它异常');
END;
要截获Oracle服务器没有预定义的错误,需先声明这个错误或者使用OTHERS处理机。
非预定义异常:
1. 在声明部分声明异常名。
语法:
exception EXCEPTION;
其中: exception 异常名
2. 使用PRAGMAEXCEPTION_INIT语句将异常处理名字和Oracle的错误代码关联起来.
语法:
PRAGMA EXCEPTION_INIT ( exception, error_number ) ;
其中: exception 先前声明的异常名
error_number 标准Oracle 错误代码3. 在相应的异常处理例程中引用已声明的异常。
关键字 PRAGMA (伪指令pseudoinstructions)表示语句是一个编译指令,在执行PL/SQL块时并不处理该语句。在PL/SQL块中,一个编译指令EXCEPTION_INIT告诉编译器将一个异常处理的名字和一个Oracle错误代码联系起来。
DECLARE
e_emp_cons EXCEPTION;
PRAGMA EXCEPTION_INIT(e_emp_cons,-00001);
BEGIN
INSERT INTO emp
SELECT * FROM emp;
EXCEPTION
WHEN e_emp_cons THEN
dbms_output.put_line('违反唯一性约束');
END;
捕获异常的函数:
•SQLCODE
返回Oracle的错误代码
•SQLERRM
返回和错误值相关联的信息
SQLCODE值 说明
0没有异常
100 NO_DATA_FOUND异常负数 其它Oracle错误号
自定义异常: