Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
拋出異常
Oracle有三種類型的異常錯誤:
?
1.?預(yù)定義(Predefined)異常
ORACLE預(yù)定義的異常情況大約有24個。對這種異常情況的處理,無需在程序中定義,由ORACLE自動將其引發(fā)。
2.?非預(yù)定義(Predefined)異常
即其他標(biāo)準(zhǔn)的ORACLE錯誤。對這種異常情況的處理,需要用戶在程序中定義,然后由ORACLE自動將其引發(fā)。
3.?用戶定義(User_define)異常
程序執(zhí)行過程中,出現(xiàn)編程人員認(rèn)為的非正常情況。對這種異常情況的處理,需要用戶在程序中定義,然后顯式地在程序中將其引發(fā)。
?
在PL/SQL中有三種方式拋出異常
-
通過PL/SQL運行時引擎——拋出Oracle異常
-
使用RAISE語句——拋出用戶定義異常
-
調(diào)用RAISE_APPLICATION_ERROR存儲過程——拋出用戶定義異常
非預(yù)定義異常
?
因為非預(yù)定義異常只有編號,沒有名稱,所以不能直接處理。
1、在PL/SQL?塊的定義部分定義異常情況:
?<異常情況>??EXCEPTION;?
2、將其定義好的異常情況,與標(biāo)準(zhǔn)的ORACLE錯誤聯(lián)系起來,使用EXCEPTION_INIT語句:
PRAGMA?EXCEPTION_INIT(<異常情況>,?<錯誤代碼> );3、在PL/SQL?塊的異常情況處理部分對異常情況做出相應(yīng)的處理。
?
INSERT INTO departments VALUES(50, 'FINANCE', 'CHICAGO');DECLAREv_deptno departments.department_id%TYPE := &deptno;deptno_remaining EXCEPTION; --1、定義異常PRAGMA EXCEPTION_INIT(deptno_remaining, -2292); --2、關(guān)聯(lián)-- -2292 是違反一致性約束的錯誤代碼 BEGINDELETE FROM departments WHERE department_id = v_deptno; EXCEPTIONWHEN deptno_remaining THEN --3、處理DBMS_OUTPUT.PUT_LINE('違反數(shù)據(jù)完整性約束!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END;?
?
用戶自定義異常處理
用戶定義的異常錯誤是通過顯式使用?RAISE?語句來觸發(fā)。
?
1、在PL/SQL?塊的定義部分定義異常情況 ;
2、RAISE?<異常情況>;
3、在PL/SQL?塊的異常情況處理部分對異常情況做出相應(yīng)的處理。
?
DECLAREv_empno employees.employee_id%TYPE :=&empno;no_result EXCEPTION; --1、定義 BEGINUPDATE employees SET salary = salary+100 WHERE employee_id = v_empno;IF SQL%NOTFOUND THENRAISE no_result; --2、拋出END IF; EXCEPTIONWHEN no_result THEN --3、處理DBMS_OUTPUT.PUT_LINE('你的數(shù)據(jù)更新語句失敗了!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM); END;?
RAISE_APPLICATION_ERROR
?
調(diào)用DBMS_STANDARD(ORACLE提供的包)包所定義的RAISE_APPLICATION_ERROR過程,可以重新定義異常錯誤消息,將應(yīng)用程序?qū)S械腻e誤從服務(wù)器端轉(zhuǎn)達(dá)到客戶端應(yīng)用程序。它為應(yīng)用程序提供了一種與ORACLE交互的方法。
語法如下:
???? RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors]?);
There are two uses for RAISE_APPLICATION_ERROR.
The first is to replace generic Oracle exception messages with our own, more meaningful messages.
The second is to create exception conditions of our own, when Oracle would not throw them.
?
create or replace procedure new_emp( p_name in emp.ename%type, p_sal in emp.sal%type, p_job in emp.job%type, p_dept in emp.deptno%type, p_mgr in emp.mgr%type , p_hired in emp.hiredate%type := sysdate ) isinvalid_manager exception; --1、定義PRAGMA EXCEPTION_INIT(invalid_manager, -2291); --2、關(guān)聯(lián)dummy varchar2(1); beginif trunc(p_hired) > trunc(sysdate) thenraise_application_error(-20000, 'NEW_EMP::hiredate cannot be in the future'); --3、拋出自定義異常end if;insert into emp( ename, sal, job, deptno, mgr , hiredate )values ( p_name, p_sal, p_job, p_dept, p_mgr , trunc(p_hired) ); exceptionwhen dup_val_on_index thenraise_application_error(-20001, 'NEW_EMP::employee called '||p_name||' already exists', true); --3、包裝Oracle異常when invalid_manager thenraise_application_error(-20002, 'NEW_EMP::'||p_mgr ||' is not a valid manager'); --3、包裝自定義異常end; /
客戶端調(diào)用時會提示詳細(xì)異常信息:
?
?
-- 測試RAISE_APPLICATION_ERROR自定義異常 SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1) BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate+1); END;* ERROR at line 1: ORA-20000: NEW_EMP::hiredate cannot be in the future --ORA-20000 ORA-06512: at "APC.NEW_EMP", line 16 ORA-06512: at line 1-- 測試RAISE_APPLICATION_ERROR包裝自定義異常 SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate) BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 8888, sysdate); END;* ERROR at line 1: ORA-20002: NEW_EMP::8888 is not a valid manager ORA-06512: at "APC.NEW_EMP", line 42 ORA-06512: at line 1-- 測試RAISE_APPLICATION_ERROR包裝Oracle異常 SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate)PL/SQL procedure successfully completed.SQL> SQL> exec new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate) BEGIN new_emp ('DUGGAN', 2500, 'SALES', 10, 7782, sysdate); END;* ERROR at line 1: ORA-20001: NEW_EMP::employee called DUGGAN already exists ORA-06512: at "APC.NEW_EMP", line 37 ORA-00001: unique constraint (APC.EMP_UK) violated --同時打印原始堆棧 ORA-06512: at line 1?
?
總結(jié)
以上是生活随笔為你收集整理的Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d-x开发之动作游戏实战--
- 下一篇: Instagram“史诗级”更新将上线