天天看點

PL/SQL異常錯誤處理

前言

未來很近,未來很遠。

一個優秀的程式都應該能夠正确處理各種出錯情況,并盡可能從錯誤中恢複。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 進行處理.
PL/SQL異常錯誤處理
螢幕快照 2018-01-14 01.51.08.png

非預定義的異常處理

--對于這類異常情況的處理,首先必須對非定義的ORACLE錯誤進行定義。步驟如下:

1.在PL/SQL 塊的定義部分定義異常情況:

<異常情況> EXCEPTION;

2.将其定義好的異常情況,與标準的ORACLE錯誤聯系起來,使用EXCEPTION_INIT語句:

PRAGMA EXCEPTION_INIT(<異常情況>, <錯誤代碼>);

在PL/SQL 塊的異常情況處理部分對異常情況做出相應的處理。

例2:删除指定部門的記錄資訊,以確定該部門沒有員工。
PL/SQL異常錯誤處理
螢幕快照 2018-01-14 01.53.49.png

使用者自定義的異常處理

--當與一個異常錯誤相關的錯誤出現時,就會隐含觸發該異常錯誤。使用者定義的異常錯誤是通過顯式使用 RAISE 語句來觸發。當引發一個異常錯誤時,控制就轉向到 EXCEPTION塊異常錯誤部分,執行錯誤處理代碼。對于這類異常情況的處理,步驟如下:

2.RAISE <異常情況>;

3.在PL/SQL 塊的異常情況處理部分對異常情況做出相應的處理。

例3:更新指定員工工資,增加100;若該員工不存在則抛出使用者自定義異常: no_result
PL/SQL異常錯誤處理
螢幕快照 2018-01-14 01.56.18.png