之前已经将游标浏览了一遍,为了提高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的区别于谁产生的,可以用在什么时候前外别混淆了