--============PLSQL==异常处理============================= -- Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。 --PLSQL错误 ----编译时错误 ----运行时错误 --运行时错误 ---- oracle错误 (ora-xxx) ---- PL/SQL运行错误 ---- 用户定义的条件 --==========ORACLE错误处理机制=============== ---- 在程序运行期间的错误对应一个异常Exception. ---- 当错误产生时抛出相应的异常.并被异常处理器捕获, ---- 程序控制权传递给异常处理器,由异常处理器来处理运行时错误. ---=========异常的触发类型================== --隐士触发 ----- oracle预定义异常 ----- 非oracle预定义异常 --显式触发 ----- 用户自定义异常 -- ========异常运行机制===================== --异常捕获通过异常处理器实现,它是程序的一个独立部分. --把错误与程序的其它部分分离开来,使程序逻辑更加易于理解. --当异常产生时,控制权立即转移到异常处理器,一旦执行控制权被转移到异常处理器,
? --就无法再回到本语句块的可执行部分,如果没有异常部分,则被传播到外层语句块.
? --==异常处理语法: exception when 异常名字1 then 处理异常语句1; when 异常名字2 or 异常名字3 then 处理异常语句2; when others then 其它处理3; -- 允许有多个异常处理器 end; --Exception关键字:标识异常处理的开始区域. --一个异常处理器可以捕获多个异常,只需要在when子句中用or连接即可 --一个异常只能被一个异常处理器捕获,并进行处理. -- others异常处理器总是作为异常处理最后一个异常处理器 , -- 负责处理那些没有被其他异常处理器捕获的异常. --========Oracle预定义错误的捕获============ --no_data_found --too_many_rows --ZERO_DIVIDE --演示 ORACLE预定义异常捕获的语法 ZERO_DIVIDE异常========== declare v_id number(4) ; begin select deptno into v_id from emp where 1= 2;--no_data_found Exception --select deptno into v_id from emp where 1= 1/0;--ZERO_DIVIDE Exception Exception when ZERO_DIVIDE then dbms_output.put_line('ZERO_DIVIDE Exception'); when no_data_found then dbms_output.put_line('no_data_found Exception'); when others then dbms_output.put_line(' Exception'); end; -- 演示关联数组的异常 declare type ind_tab_array is table of number index by binary_integer; ind_tab ind_tab_array; --自动初始化null begin --ind_tab(null) :=3 VALUE_ERROR if(ind_tab(1)) =1 --NO_DATA_FOUND then dbms_output.put_line(ind_tab(1)); end if; Exception when VALUE_ERROR then dbms_output.put_line('VALUE_ERROR'); when NO_DATA_FOUND then dbms_output.put_line('NO_DATA_FOUND'); end; --===============非预定义异常============== --非预定义异常:某些异常在oracle中没有定义名词,只有一个ORA-xxxx, SQL> insert into emp(empno ) values (null); insert into emp(empno ) values (null) * 第 1 行出现错误: ORA-01400: 无法将 NULL 插入 ("SCOTT"."EMP"."EMPNO") --我们把这样的异常定义一个名字(将异常名与异常编号相关联),称之为非预定义异常 --使用的基本过程 --a.定义一个异常名 (declare) --b.将异常名与异常编号相关联(associate) --c.在异常处理部分捕捉并处理异常(reference) declare e_key Exception;--定义 pragma exception_init(e_key,-01400);--绑定关联 begin insert into emp(empno ) values (null); Exception when e_key then dbms_output.put_line('e_key'); when others then dbms_output.put_line('unknow exception'); end; --========用户自定义异常============ --自定义异常与Oracle错误没有任何关系,有开发人员为特定情况所定义的例外 --使用的基本过程 --a.用户自定义异常必须在声明部分进行声明 --b.当异常发生时,系统不能自动触发,需要使用Raise语句触发 --c.在异常处理部分捕获并处理异常 --上述异常改成 用户自定义异常 declare e_key Exception ; empno number(4); begin if empno is null then Raise e_key; --如果是null,触发异常 end if; empno :=8080; insert into emp(empno) values (empno); Exception when e_key then dbms_output.put_line('e_key'); when others then dbms_output.put_line('exception'); end;
?