| 
                          比如,如果程序向表的主键列插入重复值,则将发生DUP_VAL_ON_INDEX错误。? 如果一个系统错误没有在标准包中定义,则需要在说明部分定义,语法如下:? 错误名 EXCEPTION;? 定义后使用PRAGMA EXCEPTION_INIT来将一个定义的错误同一个特别的Oracle错误代码相关联,就可以同系统预定义的错误一样使用了。语法如下:? PRAGMA EXCEPTION_INIT(错误名,- 错误代码);? 【训练1】? 定义新的系统错误类型。?  
 
  
  
    Sql代码? 
   
  
 
- SET?SERVEROUTPUT?ON??
  
  - ????????DECLARE??
  
  - ????????V_ENAME?VARCHAR2(10); ??
  
  - ????????NULL_INSERT_ERROR?EXCEPTION; ??
  
  - ????????PRAGMA?EXCEPTION_INIT(NULL_INSERT_ERROR,-1400); ??
  
  - ????????BEGIN??
  
  - ????????INSERT?INTO?EMP(EMPNO)?VALUES(NULL); ??
  
  - EXCEPTION ??
  
  - WHEN?NULL_INSERT_ERROR?THEN??
  
  - ????DBMS_OUTPUT.PUT_LINE(‘无法插入NULL值!‘); ??
  
  - ??WHEN?OTHERS??THEN??
  
  - ????DBMS_OUTPUT.PUT_LINE(‘发生其他系统错误!‘); ??
  
  - END;??
  
  
 
 执行结果为:?  
 
  
  
    Sql代码? 
   
  
 
- 无法插入NULL值! ??
  
  - ????????PL/SQL?过程已成功完成。??
  
  
 
 ? 说明:NULL_INSERT_ERROR是自定义异常,同系统错误1400相关联。? 自定义异常? 程序设计者可以利用引发异常的机制来进行程序设计,自己定义异常类型。可以在声明部分定义新的异常类型,定义的语法是:? 错误名 EXCEPTION;? 用户定义的错误不能由系统来触发,必须由程序显式地触发,触发的语法是:? RAISE 错误名;? RAISE也可以用来引发模拟系统错误,比如,RAISE ZERO_DIVIDE将引发模拟的除零错误。? 使用RAISE_APPLICATION_ERROR函数也可以引发异常。该函数要传递两个参数,第一个是用户自定义的错误编号,第二个参数是用户自定义的错误信息。使用该函数引发的异常的编号应该在20 000和20 999之间选择。? 自定义异常处理错误的方式同前。? 【训练1】? 插入新雇员,限定插入雇员的编号在7000~8000之间。?  
 
  
  
    Java代码? 
   
  
 
- SET?SERVEROUTPUT?ON ??
  
  - DECLARE ??
  
  - new_no?NUMBER(10); ??
  
  - new_excp1?EXCEPTION; ??
  
  - new_excp2?EXCEPTION; ??
  
  - BEGIN ??
  
  - new_no:=6789; ??
  
  - INSERT?INTO?emp(empno,ename) ??
  
  - ??VALUES(new_no,?‘小郑‘); ??
  
  - ??IF?new_no<7000?THEN ??
  
  - ????RAISE?new_excp1; ??
  
  - ??END?IF; ??
  
  - ??IF?new_no>8000?THEN ??
  
  - ????RAISE?new_excp2; ??
  
  - ??END?IF; ??
  
  - ??COMMIT; ??
  
  - EXCEPTION ??
  
  - WHEN?new_excp1??THEN ??
  
  - ????ROLLBACK; ??
  
  - ????DBMS_OUTPUT.PUT_LINE(‘雇员编号小于7000的下限!‘); ??
  
  - ????WHEN?new_excp2??THEN ??
  
  - ????ROLLBACK; ??
  
  - ????DBMS_OUTPUT.PUT_LINE(‘雇员编号超过8000的上限!‘); ??
  
  - ????END;??
  
  
 
 执行结果为:? 雇员编号小于7000的下限!? PL/SQL 过程已成功完成。? 说明:在此例中,自定义了两个异常:new_excp1和new_excp2,分别代表编号小于7000和编号大于8000的错误。在程序中通过判断编号大小,产生对应的异常,并在异常处理部分回退插入操作,然后显示相应的错误信息。? 【训练2】? 使用RAISE_APPLICATION_ERROR函数引发系统异常。?  
 
  
  
    Sql代码? 
   
  
 
- SET?SERVEROUTPUT?ON??
  
  - DECLARE??
  
  - New_no?NUMBER(10); ??
  
  - BEGIN??
  
  - ??New_no:=6789; ??
  
  - ?INSERT?INTO????emp(empno,ename) ??
  
  - ??VALUES(new_no,?‘JAMES‘); ??
  
  - IF?new_no<7000?THEN??
  
  - ????ROLLBACK; ??
  
  - ????RAISE_APPLICATION_ERROR(-20001,?‘编号小于7000的下限!‘); ??
  
  - ??END?IF; ??
  
  - ??IF?new_no>8000?THEN??
  
  - ????ROLLBACK; ??
  
  - ????RAISE_APPLICATION_ERROR?(-20002,?‘编号大于8000的下限!‘); ??
  
  - ??END?IF; ??
  
  - END;??
  
  
 
 执行结果为:?  
 
  
  
    Sql代码? 
   
  
 
- DECLARE??
  
  - ????????* ??
  
  - ????????ERROR?位于第?1?行: ??
  
  - ????????ORA-20001:?编号小于7000的下限! ??
  
  - ????????ORA-06512:?在line?9??
  
  
 
                        (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |