1. Oracle异常处理包括预定义异常错误、非预定义异常错误、自定义异常错误。
2. 编译时刻错误是由于用户输入、能力方面的原因而造成的程序语法方面的错误。这些错误在编译时会被发现,并且可以通过查询数据字典user_errors,all_errors,dba_errors来读取错误信息。
Select * from user_errors;
3. 运行时刻错误,即便程序通过了编译在运行的时候还是会出现相当多的错误。
PL/SQL程序提供了一种异常错误处理机制,在块中捕获和处理异常是由异常处理部分完成的。
Exception
When 异常错误名称1 [or 异常错误名称2] then
语句段1
When 异常错误名称3 [or 异常错误名称4] then
语句段2
When others then
语句段3
End;
4. 当块内执行部分发生一个异常错误的时候,PL/sql首先在当前块中查找异常处理部分,其查找过程是:将所发生的异常错误名称与when子句中异常错误名称逐个进行比较,如果有相同的,则执行其后的语句段,否则转去执行when others后的语句段。
如果当前块的异常处理不包含when others子句,就会造成一些异常错误不能在当前块儿中查找到异常处理程序,这样就导致异常错误向当前块之外传播。这时,PL/sql将在外层块中查找异常处理程序,如果找到则执行,否则继续向外层块中传播,知道找到为止,否则程序将异常结束。
5. 当执行完成错误处理之后,PL/sql将控制权转移到异常处理部分外层块的下一条语句。如果异常处理部分位于最外层块,那么PL/sql将结束当前程序的运行。
6. 当异常错误发生在声明部分或者异常处理部分时,当前块的异常处理部分无法捕获它们,这两个地方发生的异常错误将直接传播到它的外层块中,然后对异常进行处理。
7. 异常错误分为系统预定义和非预定义两种,虽然声明和引发方式不同,但异常错误处理程序的书写方法和执行过程是一样的。
8. 预定义异常错误集锦
9. 预定义的异常错误是有限的,大约为20个,在PL/sql程序可以使用非预定义的异常错误处理方法。步骤如下:
1) 在声明部分用exception类型定义异常错误的名称
变量和异常的声明相似,但它不是变量,不能出现在赋值语句中。异常和变量的作用域的规则是相同的。
2) 在声明部分,用exception_init编译指令建立该异常错误名称与某个oracle错误之间的联系。因此当该oracle错误发生时,就能够自动引发该异常错误,而不需要使用raise语句来引发。
3) 使用格式为:
E_null_error exception;
Pragma exception_init (e_null_error,-1400);
其中e_null_error是定义的异常错误名称,-1400是oracle错误指定的编码。
10. 另一种处理异常错误的方法是在when others子句中使用内置异常错误函数sqlcode和sqlerrm。其中sqlcode函数没有参数,它返回oracle错误的代码。
Sqlerrm(oracle_error_code)函数按照输入的oracle错误代码oracle_error_code,返回对应的oracle错误消息文本。当省略oracle_error_code时,sqlerrm函数返回sqlcode当前值对应的错误消息文本。
注:特殊情况,oracle_error_code为+1时,返回“user_defined exception”,当oracle_error_code为0时,返回“ora_0000:normal,successful completion”,当oracle_error_code为+100时,返回“ora-1403:no data found”,当oracle_error_code为正数时,返回“non_oracle exception”
11. 自定义异常是由PL/sql程序员自定义的异常,他并不是一个错误,而是程序员根据编程和调试的需要而为特殊情况所定义的异常。自定义异常必须声明,而且需要使用raise语句显式引发。