1. 异常处理
编译异常:程序的语法出现了错误所导致的异常;
运行时异常:程序没有语法问题,但在运行时会因为程序运算或者返回结果而出现错误。
用exception字句来编写异常处理代码,而在进行异常处理之前,首先判断出现的是何种异常
WHEN 异常类型|用户定义异常|异常代码|OTHERS then
异常处理;
Eg:①处理被除数为0异常
Exception
When zero_divide Then
Dbms_output.put_line(‘被除数为0 ’);
Dbms_output.put_line(SQLCODE);
②处理赋值异常
Declare
V_varAvarchar2(1);
V_varBvarchar2(1) :=’JAVA’;
BEGIN
V_varA:= V_varB;
Dbms_output.put_line(‘异常之后的代码将不再执行’);
Exception
When value_error Then
Dbms_output.put_line(‘数据赋值错误’);
Dbms_output.put_line(SQLCODE);
END;
① 据查询异常
无数据异常:
Declare
V_enovarchar2(10);
V_enamevarchar2(100);
BEGIN
V_eno:=&empno;---键盘输入雇员编号
Selectename into v_ename from emp where enpno=v_eno;
Dbms_output.put_line(‘编号为:’||v_eno||’雇员的名称为:’||v_ename);
Exception
When no_data_found Then
Dbms_output.put_line(‘没有雇员’);
Dbms_output.put_line(SQLCODE);
END;
多数据异常:
Declare
V_dnovarchar2(10);
V_enamevarchar2(100);
BEGIN
V_dno:=&deptno;---键盘输入雇员编号
Selectename into v_ename from emp where deptno=v_dno;
Exception
When too_many_rows Then
Dbms_output.put_line(‘返回的数据太多’);
Dbms_output.put_line(SQLCODE);
END;
② 实际开发不可能记住每一种异常,plsql提供了一种更为简便的异常处理,使用OTHERS
Declare
V_dnovarchar2(10);
V_enamevarchar2(100);
BEGIN
V_dno:=&deptno;---键盘输入雇员编号
Selectename into v_ename from emp where deptno=v_dno;
Exception
When others Then
Dbms_output.put_line(SQLERRM);
Dbms_output.put_line(SQLCODE);
END;
2. 自定义异常处理
程序中,也可以将用户自定义的异常添加到异常列表(异常堆栈)中,语法:
Raise_application_error(错误号,错误信息[,是否添加到错误堆栈])
错误号:只接受-20000到-20999范围的错误号,和声明的错误号一直
错误信息:用于定义在使用SQLEERM输出时的错误提示信息
是否添加到错误堆栈:如果为TRUE,则表示将错误添加到任意已有的错误堆栈,默认为false。
Declare
V_dnovarchar2(10);
V_dnavarchar2(100);
V_dloc varchar2(100);
V_deptCount number;
BEGIN
V_dno:=&inputDeptno;
V_dna :=&inputDname;
V_dloc :=&inputLoc;
Selectcount(deptno) into v_deptCount from dept where deptno=v_dno;
Ifv_deptCount>0 Then
Raise_application_error(-20888,’次部门编号已经存在’)
Else
Insert into dept(deptno,dname,dloc)values(v_dno,v_dna,v_dloc);
Dbms_output.put_line(‘新部门增加成功’);
Commit;
Endif;
Exception
When others Then
Dbms_output.put_line(SQLERRM);
Dbms_output.put_line(SQLCODE);
Rollback;
END;