之前已经将游标浏览了一遍,为了提高PLSQL程序健壮性,先来写PLSQL的例外处理,即如果PLSQL代码块发生的报错,正常下不去捕捉处理,肯定会停止执行,捕捉到了例外并进行相应的处理,可以让程序继续执行,发生的未知错误称之为例外。
目标
1)使用预定义例外
2)使用非预定义例外
3)使用自定义例外
定义三种例外比较搞笑,预定义就是oracle常见的错误,非预定义就是处理预定义所不能处理的oracle错误,自定义就是处理跟oracle无关的错误。
捕捉并处理例外
EXCEPTION
WHEN exception1 Then
statement1
、、、、
WHEN OTHERS THEN
statementend
记住 when others 永远在例外处理的最后一个条件那里,代表了以上你写的所有when都不满足的时候满足此others
【预定义错误】
由PLSQL提供的系统例外,违反了Oracle规则或系统限制时,就会触发一个内部例外,大概提供了二十多个,每一个预定义例外对应一个Oracle系统错误,如NO_DATA_FOUND对应的是ORA-01403错误
当没有数据获取的时候就会隐含的触发这个错误,TOO_MANY_ROWS等
【非预定义错误】
非预定义错误用于处理与预定义例外无关的Oracle错误,这里给了一个案例就是比如违反了约束。
使用的时候需要三步:
1)定义部分定义例外名称,declare e_integrity exception;
2)在例外和Oracle错误之间建立关联 pragma exception_init(e_integrity,-2291);
3)例外处理部分捕捉并处理例外
declare
e_integrity exception;
pragma exception_init(e_integrity,-2291);
begin
update emp set deptno=%dno where empno=&eno;
commit;
exception
when e_integrity then
dbms_output.put_line('not exists deptno');
when others then
dbms_output.put_line(sqlcode);
end;
【自定义例外】
自定义例外最大的区别就是需要显示的触发,
使用的时候三步:
1)定义部分定义 e_no_employee exception;
2)执行部分触发 if SQL%NOTFOUD then raise e_no_employee;
3)例外处理部分捕捉并处理
declare
e_integrity exception;
pragma exception_init(e_integrity,-2291);
e_no_employee exception;
begin
update emp set deptno=&dno where empno=&eno;
if SQL%NOTFOUND then
raise e_no_employee;
end if;
exception
when e_integrity then
dbms_output.put_line('deptno not exists');
when e_no_employee then
dbms_output.put_line('empno not exists');
end;
另外一种就是例外函数,这个在c编写的时候经常用到就是SQLCODE和SQLERRM,用于取得错误号和错误信息,
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
在一个另外就是编译的时候经常用到的警告分为三类:
1)server:如参数的别名问题,
2)performance :性能问题,如类型变换时的性能问题
3)all:该关键字用于检查所有警告
控制警告消息
alter system set plsql warnings='enable:all';
alter session set plsql_warnings='enable:performance';
alter procedure hello complie ;这句话好像是重新编译hello过程
这个问题关键是理解这三类警告信息,比如死代码需要用哪个类检查,不执行但是有应该是代码块执行的性能问题,所以检查的时候制成performance,
另外一点是属性与异常,比如SQL%NOTFOUND与NO_DATA_FOUND的区别于谁产生的,可以用在什么时候前外别混淆了
本文转自 aklaus 51CTO博客,原文链接:http://blog.51cto.com/aklaus/1953983