Oracle中的錯(cuò)誤可以分為如下兩大類:
- 編譯時(shí)錯(cuò)誤:程序在編寫過程中出現(xiàn)的錯(cuò)誤。PL/SQL引擎在進(jìn)行編譯時(shí)會(huì)發(fā)現(xiàn)這些錯(cuò)誤并報(bào)告給用戶,此時(shí)程序還沒有完全運(yùn)行。
- 運(yùn)行時(shí)錯(cuò)誤:程序在運(yùn)行過程中因?yàn)楦鞣N各樣的原因產(chǎn)生的運(yùn)行時(shí)錯(cuò)誤。由于這類錯(cuò)誤優(yōu)勢難以預(yù)料,因此需要異常處理機(jī)制來進(jìn)行處理。
基本的異常處理結(jié)構(gòu)的PL/SQL包含3個(gè)部分:
- 在定義區(qū),定義異常。如果使用預(yù)定義異常,則不用再定義區(qū)定義異常。
- 在執(zhí)行區(qū),可以顯式地觸發(fā)異常,也可以有PL/SQL引擎觸發(fā)異常。
- 只要在執(zhí)行過程中出現(xiàn)了異常,那么在執(zhí)行區(qū)中后續(xù)的語句將立即停止執(zhí)行,語句執(zhí)行流程跳轉(zhuǎn)到異常處理區(qū)。
看一個(gè)典型的異常處理的PL/SQL示例:
DECLARE e_duplicate_name EXCEPTION; --定義異常 v_ename emp.ename%TYPE; --保存姓名的變量 v_newname emp.ename%TYPE := '史密斯'; --新插入的員工名稱 BEGIN BEGIN --在嵌套塊中處理異常 SELECT ename INTO v_ename FROM emp WHERE empno = 7369; IF v_ename = v_newname THEN RAISE e_duplicate_name; --如果產(chǎn)生異常,觸發(fā)e_duplicate_name異常 END IF; EXCEPTION WHEN e_duplicate_name THEN v_newname:='劉大夏'; END; --如果沒有異常,則執(zhí)行插入語句 INSERT INTO emp VALUES (7881, v_newname, '職員', NULL, TRUNC (SYSDATE), 2000, 200, 20);EXCEPTION --異常處理語句塊 WHEN OTHERS THEN DBMS_OUTPUT.put_line('異常編碼:'||SQLCODE||' 異常信息:'||SQLERRM); END;
再看一個(gè)示例:
DECLARE e_outerexception EXCEPTION; e_innerexception EXCEPTION; e_threeexception EXCEPTION; BEGIN BEGIN RAISE e_innerexception; RAISE e_outerexception; RAISE e_threeexception; EXCEPTION WHEN e_innerexception THEN RAISE e_outerexception; WHEN e_outerexception THEN --異常處理代碼 WHEN OTHERS THEN --異常處理代碼 END; EXCEPTION WHEN e_outerexception THEN --異常處理代碼 END;
聯(lián)系客服