程序在执行过程中出现异常是正常的,在程序的编写过程中出现异常也是不可避免的。但是要有相应的异常处理的机
制,来保证程序的正常执行。PL/SQL程序执行过程中出现的错误,称为异常。一个优秀的程序都应该能够正确处理
各种出错的情况,并尽可能的从错误中恢复。PL/SQL提供了异常处理机制。
概念:
异常处理(exception)是用来处理正常执行过程中未预料的事件,程序块的异常处理定义的错误和自定义的错误, 由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会异常的终止。
有三种类型的错误
预定义异常: 是Oracle系统异常中的一种,用于处理常见的异常。Oracle系统定义了它们的错误编号和名字。当运行PL/SQL代码产生预定义错误时,该异常会被自动的抛出,异常处理机制捕获后,进行处理。最常用的两个异常是no_date_found 和 too_mang_rows ,错误编号为1403 和1422 ,为没有找到数据和结果返回多行错误。 非预定义异常: 该类异常特定是,Oracle定义了它们的编号,但是没有名字,需要用户在声明中定义它们的名字,有Oracle自动引发。 自定义异常: 处理用户定义的错误,有些操作并不会产生系统错误,但是从业务角度规则考虑,不是很符合规则。
结构:
EXCEPTION
WHEN exception_name1 THEN code ;
WHEN exception_name2 THEN code ;
...
WHEN OTHERS THEN code ;
END ;
异常处理步骤
定义异常:在声明部分为错误异常定义。exce_name exception ; pragma exception_init(exce_name error_number); 抛出异常:产生错误时,抛出与异常对应的错误。raise exce_name ; 捕获及处理异常:异常处理部分对异常进行捕获,并进行处理。
例:使用预定义异常no_data_found ,避免运行时提示未找到数据。
declare v_sal emp.sal%type ; begin select sal into v_sal from emp where empno = 7938 ; dbms_output.put_line(v_sal); exception when no_data_found then dbms_output.put_line(‘没有该条数据‘); end;
在执行delete from dept where deptno = 10语句的时候,系统会抛出 ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录 异常。系统为它定义了编号,但是没有命名名字,用户可以自定义一个名字。
例:非定义异常,处理违反完整性约束错误。
exce_deptno exception ; pragma exception_init(exce_deptno , -2292) ; delete from dept where deptno = 10 ; when exce_deptno then dbms_output.put_line(‘雇员表中使用了该部门号‘); end ;
例:用户自定义异常,当雇员的工资小于1000 时,抛出异常并进行处理。
e_sal exception ; v_empno emp.empno%type ; cursor cou_sal is select * from emp ; for c in cou_sal loop dbms_output.put_line(c.sal); if(c.sal < 1000) then v_empno := c.empno; raise e_sal ; end if ; end loop ; when e_sal then dbms_output.put_line(v_empno || ‘该涨工资了‘);
异常函数
PL/SQL程序在出现出错时,通过使用异常函数可以获得错误代码以及相关的错误说明,使用SQLCODE用于获得错误代码,SQLERRM用户获得错误描述。
例:获得错误代码和描述
delete from dept where deptno =10 ; when others then dbms_output.put_line(sqlcode || ‘---‘||sqlerrm);