異常在代碼中的聲明部分聲明,在執行部分引發,在異常處理部分處理。一般異常分爲兩中:預定義異常和用戶自定義異常。
下面通過代碼分別介紹異常的聲明、執行、處理。
1、用戶自定義異常
(a)異常聲明
- DECLARE
- -- Exception to indicate an error condition
- e_DuplicateAuthors EXCEPTION;
同時在DECLARE部分聲明其他三個變量,供下面函數使用
- v_Author1 books.author1%TYPE;
- v_Author2 books.author2%TYPE;
- v_Author3 books.author3%TYPE;
(b)異常引發,用戶自定義異常是通過RAISE語句顯示引發,而預定義異常則是在與它們關聯的Oracle錯誤發生時候隱式引發的。異常引發代碼如下:
- BEGIN
- /* Find the IDs for the 3 authors of 'Oracle9i DBA 101' */
- SELECT author1, author2, author3
- INTO v_Author1, v_Author2, v_Author3
- FROM books
- WHERE title = 'Oracle9i DBA 101';
- /* Ensure that there are no duplicates */
- IF (v_Author1 = v_Author2) OR (v_Author1 = v_Author3) OR
- (v_Author2 = v_Author3) THEN
- RAISE e_DuplicateAuthors;
- END IF;
(c)異常處理
- EXCEPTION
- WHEN e_DuplicateAuthors THEN
- INSERT INTO log_table (info)
- VALUES ('Oracle9i DBA 101 has duplicate authors');
- end;
2、預定義異常
預定義異常列表
Oracle錯誤編號 | 等價異常名稱 | 說明 | ||
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 | 無效的用戶名/口令 | ||
|
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 |
|
試圖打開一個已處於打開狀態的遊標 | ||
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 索引得引用大於集合中元素的個數 | ||
(a)異常聲明
由於預定義異常是在與它們關聯的Oralce錯誤發生的時候隱式引發的,所以不需要異常聲明。
(b)異常引發
下面這段程序是向authors表中插入主鍵重複的記錄。因此當第二條INSERT試圖插入的時候,就會引發了這個錯誤:
ORA-0001:unique constraint(<constraint name>) violated
該錯誤對應的異常就是DUP_VAL_ON_INDEX異常。
- BEGIN
- INSERT INTO authors (id, first_name, last_name)
- VALUES (20000, 'John', 'Smith');
- INSERT INTO authors (id, first_name, last_name)
- VALUES (20000, 'Susan', 'Ryan');
- END;
(c)異常處理
異常引發後,將不會執行下面這條語句,直接跳出異常。
- INSERT INTO authors (id, first_name, last_name)
- VALUES (20000, 'Susan', 'Ryan');