| Sql代码?比如,如果程序向表的主键列插入重复值,则将发生DUP_VAL_ON_INDEX错误。?
 如果一个系统错误没有在标准包中定义,则需要在说明部分定义,语法如下:?
 错误名 EXCEPTION;?
 定义后使用PRAGMA EXCEPTION_INIT来将一个定义的错误同一个特别的Oracle错误代码相关联,就可以同系统预定义的错误一样使用了。语法如下:?
 PRAGMA EXCEPTION_INIT(错误名,- 错误代码);?
 【训练1】? 定义新的系统错误类型。?
 
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?过程已成功完成。?? Java代码?? 说明:NULL_INSERT_ERROR是自定义异常,同系统错误1400相关联。?
 自定义异常?
 程序设计者可以利用引发异常的机制来进行程序设计,自己定义异常类型。可以在声明部分定义新的异常类型,定义的语法是:?
 错误名 EXCEPTION;?
 用户定义的错误不能由系统来触发,必须由程序显式地触发,触发的语法是:?
 RAISE 错误名;?
 RAISE也可以用来引发模拟系统错误,比如,RAISE ZERO_DIVIDE将引发模拟的除零错误。?
 使用RAISE_APPLICATION_ERROR函数也可以引发异常。该函数要传递两个参数,第一个是用户自定义的错误编号,第二个参数是用户自定义的错误信息。使用该函数引发的异常的编号应该在20 000和20 999之间选择。?
 自定义异常处理错误的方式同前。?
 【训练1】? 插入新雇员,限定插入雇员的编号在7000~8000之间。?
 
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;?? Sql代码?执行结果为:?
 雇员编号小于7000的下限!?
 PL/SQL 过程已成功完成。?
 说明:在此例中,自定义了两个异常:new_excp1和new_excp2,分别代表编号小于7000和编号大于8000的错误。在程序中通过判断编号大小,产生对应的异常,并在异常处理部分回退插入操作,然后显示相应的错误信息。?
 【训练2】? 使用RAISE_APPLICATION_ERROR函数引发系统异常。?
 
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?? (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |