2012年1月5日 星期四 (oracle读书笔记,PL/SQL异常错误处理)

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语句显式引发。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值