在程序执行过程中,如果发生了错误,就是产生了异常。这时,正常的处理将终止,控制转移到pl/sql块或子程序的异常处理部分。异常处理程序执行结束后,控制将返回到调用块,如果没有调用块则返回到宿主环境……
在pl/sql中,称警告或错误状态为异常。为了处理异常,用户必须编写称为异常处理程序的例程。
在程序执行过程中,如果发生了错误,就是产生了异常。这时,正常的处理将终止,控制转移到pl/sql块或子程序的异常处理部分。异常处理程序执行结束后,控制将返回到调用块,如果没有调用块则返回到宿主环境。
在pl/sql块设置异常处理有这样的好处:
- 把正常处理和异常处理分开,使程序结构清晰,可以增强程序的易读性。
- 提高程序的可靠性。如果没有异常处理,则每执行一个命令,就必须进行相应的错误检查。如果遗忘了,则不但不能发现错误还可能引起新的错误,并且正常处理和异常处理交织在一起,使程序难读。
对于异常的处理分为以下几种情况:
- 捕获系统异常并在exception中捕获及处理
- 自定义异常名,并手工抛出自定义异常,并在exception中捕获及处理
- 为没有没有命名的系统错误号声明异常,并在exception中捕获及处理
激活exception 异常:
- 在语句块中的异常可以由raise 语句来激活
- 异常可以由程序员进行准确地激活。然而当数据库产生内部错误时它会被自动激活或由默认的数据库服务来调用
语法:
declare exception_name exception; begin if condition then raise exception_name; end if; exception when exception_name then statement; end; |
异常的处理
语法:
exception when exception1 then statement1 when exception2 then statement2 when others then statement3 ************************** |
运行一个pl/sql 语句块
pl/sql通常在一个主机的编辑器上创建而它的运行则与常规的sql 脚本文件一样。pl/sql在语句块中的每一条语句――从变量的赋值到数据操作命令――使用分号结束。
在sql 的脚本中正斜线(/)表示结束, 在pl/sql 也使用正斜线来表明脚本的结束。最为容易的运行pl/sql 语句块的方法是使用start 命令,或简写为sta 或@。
pl/sql 在它的语法部分中并没有提供直接的方式来显示输出,但是它可以调用一个对该语句块服务的包,这个包是由dbms_output 来调用的。
\
命令 set serveroutput on 将输出流打开
exception
when zero_divide then
dbms_output.put_line('error:
divisor is zero. see your dba.')
预定义异常
每当pl/sql程序违反了oracle的规则或超出系统的限制,系统就自动地产生内部异常。每个oracle异常都有一个号码,但异常必须按名处理。
因此,pl/sql对那些常见的异常预定义了异常名。
用户定义异常
1.pl/sql允许用户定义自己的异常。用户定义的异常必须由用户自己说明并使用raise语句显式地提出。
声明异常:
用户定义的异常只能在pl/sql块的声明部分进行声明。声明方式与变量声明类似。
格式为:
异常名 exception;
异常是一种状态而不是一个对象,因此,异常名不能出现在赋值语句或sql语句中
2.为内部异常命名:
为了处理未命名的内部异常,必须使用others处理程序或用伪指令exception_init。
在pl/sql中,exception_init的作用是告诉编译程序将一个异常名与一个oracle错误号码联系起来。这样用户就可以按名引用任何内部异常,
并为它编写一个特定的处理程序。
语法:
pragma exception_init(异常名,oracle错误号);
说明:该语句必须在pl/sql块、子程序或包的说明部分使用,并且异常名必须是在同一声明部分中该语句的前面已声明过的异常名。