一、异常概念:指的是程序在运行过程中出现的错误,当异常发生时,可执行部分的代码会终止运行,
转到响应的异常处理机部分去继续执行。
二、异常的触发方式?
自动触发:当满足一定的条件时,自动发生的异常。
手动触发:需要程序员在块中写raise语句来发生异常。
三、异常的处理方式?
在自己的块中写异常处理机。
在调用环境中传播。
四、异常的类型
1、预定义异常:由Oracle服务器事先声明好的异常,自动被触发的,有名字,有编号。
2、未预定义异常:自动被触发,有编号,没名字。
3、自定义异常:oracle不自动提供,手动触发的,没名字,没编号。
五、如果写异常处理机:
Exception
When 异常名字1 [Or 异常名字2 ....] Then
异常处理代码;
【 When 异常名字11 [Or 异常名字21 ....] Then
异常处理代码;
When Others then
异常处理代码
】
六、如何处理预定义异常?
在exception部分写异常处理机即可。
练习:使用insert子句,把员工表中的数据复制一边,要写异常处理代码。
Begin
Insert Into emp Select * From emp;
Exception
When dup_val_on_index Then
dbms_output.put_line('主键重复');
End;
七、SQLCODE和SQLERRM两个函数
Sqlcode:返回最近执行的一条Sql语句的执行代码。
=0,表示没有异常,成功。
=100,表示发生NO_Data_found异常。
<0,表示出现其他异常。
Sqlerrm:返回执行一条SQL语句的相关信息。
既可以用在可执行块,也可以用在异常处理块。
通常使用Sqlcode 是否等于0做sql语句执行成功与否的判断。
八、如何处理未预定义异常?
1、在declare部分先声明异常,语法: 异常名 Exception;
2、使用预编译指令 Pragma exception_init(异常名,异常号);把异常名和异常号进行关联。
3、写异常处理机即可。
注意:使用该种方式既可以处理预定义异常,也可以处理未预定义异常,但要注意同一个异常被两个异常处理机
处理的情况。
九、如何处理自定义异常?
1、在declare部分先声明异常,语法: 异常名 Exception;
2、在程序可执行部分,想抛出异常的代码中使用 raise 异常名,进行触发异常。
3、写异常处理机即可。
练习:使用异常处理方式,判断员工的平均工资,如果平均工资大于5000,触发too_high_exception,否则,触发too_low_exception.
Declare
too_high_exception Exception;
too_low_exception Exception;
v_avgsal emp.sal%Type;
Begin
Select Avg(sal) Into v_avgsal From emp;
If v_avgsal >5000 Then
Raise too_high_exception;
Else
Raise too_low_exception;
End If;
Exception
When too_high_exception Then
dbms_output.put_line('平均工资太高');
When too_low_exception Then
dbms_output.put_line('平均工资正常');
End;
十、异常传递
略。