比如,如果程序向表的主键列插入重复值,则将发生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??
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|