前言
未來很近,未來很遠。
一個優秀的程式都應該能夠正确處理各種出錯情況,并盡可能從錯誤中恢複。ORACLE 提供異常情況(EXCEPTION)和異常處理(EXCEPTION HANDLER)來實作錯誤處理。
異常處理概念
--異常情況處理(EXCEPTION)是用來處理正常執行過程中未預料的事件,程式塊的異常處理預定義的錯誤和自定義錯誤,由于PL/SQL程式塊一旦産生異常而沒有指出如何處理時,程式就會自動終止整個程式運作。
有三種類型的異常錯誤:
預定義 ( Predefined )錯誤
--ORACLE預定義的異常情況大約有24個。對這種異常情況的處理,無需在程式中定義,由ORACLE自動将其引發。
非預定義 ( Predefined )錯誤
--即其他标準的ORACLE錯誤。對這種異常情況的處理,需要使用者在程式中定義,然後由ORACLE自動将其引發。
使用者定義(User_define) 錯誤
--程式執行過程中,出現程式設計人員認為的非正常情況。對這種異常情況的處理,需要使用者在程式中定義,然後顯式地在程式中将其引發。
異常處理部分一般放在 PL/SQL 程式體的後半部,結構為:
EXCEPTION
WHEN first_exception THEN <code to handle first exception >
WHEN second_exception THEN <code to handle second exception >
WHEN OTHERS THEN <code to handle others exception >
END;
預定義的異常處理
錯誤号 | 異常錯誤資訊名稱 | 說明 |
---|---|---|
ORA-0001 | Dup_val_on_index | 試圖破壞一個唯一性限制 |
ORA-0051 | Timeout-on-resource | 在等待資源時發生逾時 |
ORA-0061 | Transaction-backed-out | 由于發生死鎖事務被撤消 |
ORA-1001 | Invalid-CURSOR | 試圖使用一個無效的遊标 |
ORA-1012 | Not-logged-on | 沒有連接配接到ORACLE |
ORA-1017 | Login-denied | 無效的使用者名/密碼 |
ORA-1403 | No_data_found | SELECT INTO沒有找到資料 |
ORA-1422 | Too_many_rows | SELECT INTO 傳回多行 |
ORA-1476 | Zero-divide | 試圖被零除 |
ORA-1722 | Invalid-NUMBER | 轉換一個數字失敗 |
ORA-6500 | Storage-error | 記憶體不夠引發的内部錯誤 |
ORA-6501 | Program-error | 内部錯誤 |
ORA-6502 | Value-error | 轉換或截斷錯誤 |
ORA-6504 | Rowtype-mismatch | 宿主遊标變量與 PL/SQL變量有不相容行類型 |
ORA-6511 | CURSOR-already-OPEN | 試圖打開一個已存在的遊标 |
ORA-6530 | Access-INTO-null | 試圖為null 對象的屬性指派 |
ORA-6531 | Collection-is-null | 試圖将Exists 以外的集合( collection)方法應用于一個null pl/sql 表上或varray上 |
ORA-6532 | Subscript-outside-limit | 對嵌套或varray索引得引用超出聲明範圍以外 |
ORA-6533 | Subscript-beyond-count | 對嵌套或varray 索引得引用大于集合中元素的個數 |
--對這種異常情況的處理,隻需在PL/SQL塊的異常處理部分,直接引用相應的異常情況名,并對其完成相應的異常錯誤處理即可。
例1:更新指定員工工資,如工資小于3000,則加3000;對 NO_DATA_FOUND 異常, TOO_MANY_ROWS 進行處理.
螢幕快照 2018-01-14 01.51.08.png![]()
PL/SQL異常錯誤處理
非預定義的異常處理
--對于這類異常情況的處理,首先必須對非定義的ORACLE錯誤進行定義。步驟如下:
1.在PL/SQL 塊的定義部分定義異常情況:
<異常情況> EXCEPTION;
2.将其定義好的異常情況,與标準的ORACLE錯誤聯系起來,使用EXCEPTION_INIT語句:
PRAGMA EXCEPTION_INIT(<異常情況>, <錯誤代碼>);
在PL/SQL 塊的異常情況處理部分對異常情況做出相應的處理。
例2:删除指定部門的記錄資訊,以確定該部門沒有員工。
螢幕快照 2018-01-14 01.53.49.png![]()
PL/SQL異常錯誤處理
使用者自定義的異常處理
--當與一個異常錯誤相關的錯誤出現時,就會隐含觸發該異常錯誤。使用者定義的異常錯誤是通過顯式使用 RAISE 語句來觸發。當引發一個異常錯誤時,控制就轉向到 EXCEPTION塊異常錯誤部分,執行錯誤處理代碼。對于這類異常情況的處理,步驟如下:
2.RAISE <異常情況>;
3.在PL/SQL 塊的異常情況處理部分對異常情況做出相應的處理。
例3:更新指定員工工資,增加100;若該員工不存在則抛出使用者自定義異常: no_result
螢幕快照 2018-01-14 01.56.18.png![]()
PL/SQL異常錯誤處理