例外(exception)是一种pl/sql标示符,他用于处理pl/sql程序的运行错误。为了提高pl/sql程序的健壮性,开发人员必须要考虑pl/sql程序可能出现的各种错误,并编写相应的例外处理部分。如果不进行错误处理,那么在出现运行错误时,会终止pl/sql程序的运行,并显示错误信息。
例子:
declare v_ename emp.ename%type; begin select ename into v_ename from emp where empno=&no; dbms_output.put_line('雇员名:'||v_ename); end; /
输入no的值:1111
ORA-01403: 未找到任何数据
处理预定义例外
NO_DATA_FOUND :该例外对应于ora-01403错误。当执行select into 未返回行,或者引用未初始化的pl/sql表元素时,会隐含的触发该例外。
TOO_MANY_ROW : 该例外对应于ora-01422错误。当执行select into语句时,如果返回超过一行,则会触发该例外。
DUP_VAL_ON_INDEX:该例外对应于ora-00001错误。当唯一索引所对应的列上键入重复值时,会隐含的触发该例外。
ZERO_DIVIDE :该例外对应于ora-10476错误。当运行pl/sql块是,如果使用数字值除0,则会隐含的触发该例外。
INVALID_CURSOR :该例外对应于ora_01001错误。当试图在不合法的游标上执行操作时,会隐含的触发该例外。
例子:
declare v_ename emp.ename%type; begin select ename into v_ename from emp where empno=&no; dbms_output.put_line('雇员名:'||v_ename); exception when no_data_found then dbms_output.put_line('该雇员不存在'); end; /
输入no的值:1234
该雇员不存在
处理非预定义例外
非预定义例外用于于预定义例外无关的oracle错误。当使用预定义例外时,只能处理21个oracle错误。为了处理其他oracle错误,必须使用非预定义例外。使用非预定义例外的步骤 定义例外——关联例外和错误——引用例外
例子:
declare e_integrity exception; pragma exception_init(e_integrity,-2291); begin update emp set deptno=&dno where empno=&eno; exception when e_integrity then dbms_output.put_line('该部门不存在'); end; /
输入dno的值:15
输入eno 的值:7782
该部门不存在
因为dept表和emp表之间具有主外键关系,所以当修改雇员名的部门号时,部门号必须在dept表中存在。如果该部门不存在,则会隐含触发ora-02291对应的例外e_integrity,并显示合理的输出信息。
处理自定义例外
自定义例外是指pl/sql开发人员所定义的例外。预定义和非预定义例外都与oracle错误有关,并且当出现oracle错误时会隐含触发相应例外;而自定义例外与oracle错误没有任何关联,他是由开发人员为特定情况所定义的例外。步骤:定义例外——显式触发例外——引用例外
例子:
eclare 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('该部门不存在'); when e_no_employee then dbms_output.put_line('该雇员不存在'); end; /
输入dno的值:10
输入eno的值:1234
该雇员不存在