异常处理块:错误发生是要进行执行和处理的代码
语法:
begin
...
--注意exception放在bgin和end代码块的最后一部分,紧接着end
exception --exception和begin,end同级
when except_name1 then
...
when except_name2 then
...
end;
常见的异常处理:
-
预定义异常:
运行系统产生的,例如:ZERO_DIVIDE(除以0)异常
常见的预定义异常:
- NO_DATA_FOUND:查询时未找到数据
- DUP_VAL_ON_INDEX:视图破坏唯一性约束
- VALUE_ERROR:转换类型错误
- TOO_MANY_ROWS:select into返回多行
其它:
declare x number; begin x:='aaa'; exception when VALUE_ERROR then dbms_output.put_line('类型转换错误'); end;
-
自定义异常:
调用异常处理的时候需要使用raise语句。
--用户自定义异常 declare vage Student.Sage%type; over_child exception; begin select sage into vage from Student where sno='001'; if vage>12 then raise over_child; --发起一个异常 end if; exception when over_child then dbms_output.put_line('该同学已不是少年'); end;
-
嵌套程序捕获异常
--嵌套程序中捕获异常 declare vsname Student.sname%type; vssex Student.Ssex%type; vsno SC.sno%type; begin --嵌套程序一 begin select sname into vsname from Student where sno='000'; exception when no_data_found then dbms_output.put_line('没有数据'); end; --嵌套程序二 begin select sno into vsno from SC where sno='001'; exception when too_many_rows then dbms_output.put_line('返回太多行'); end; --嵌套程序三 begin insert into Student(sno,sname,ssex,sage,sdept) values('001','hhh','f',1,'CS'); exception when dup_val_on_index then dbms_output.put_line('违背唯一性错误'); end; --嵌套程序四 begin vssex:='美女'; exception when value_error then dbms_output.put_line('类型转换错误'); end; end;
嵌套程序捕获异常和一般的捕获异常区别:
一般的捕获异常,捕获到一个异常之后就不会执行后面的程序。而嵌套程序捕获异常,每个程序是互不影响的。