異常被稱為程序執行期間的錯誤條件。程序員使用exception來捕獲程序中的這些錯誤條件。有兩種不同的例外:
- 係統定義的異常
- 用戶自定義異常
異常處理語法:
DECLARE BEGIN <可執行命令> EXCEPTION <異常處理goes here > WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements WHEN exception3 THEN exception3-handling-statements ........exception - 3-handling-statements結束;
提高異常
數據庫服務器在出現內部數據庫錯誤時自動引發異常,但這些異常是由程序員使用RAISE命令顯式引發的。
語法:DECLARE exception_name EXCEPTION;開始IF條件然後拋出異常如果;EXCEPTION WHEN exception_name THEN語句;結束;
語法:DECLARE my_exception EXCEPTION;示例:DECLARE t_id teachers。Id %type:= &tt_id;t_name teacherS.Name %類型;t_addr teachers.address %類型;——用戶自定義異常ex_invalid_idstart IF t_id <= 0 THEN RAISE ex_invalid_id;ELSE SELECT name, address INTO t_name, t_addr FROM teacherDBMS_OUTPUT。PUT_LINE ('Name: '|| t_name);DBMS_OUTPUT。PUT_LINE ('Address: ' || t_addr); END IF;
異常
WHEN ex_invalid_id THEN
dbms_output。put_line('ID必須大於零!');
當no_data_found THEN
dbms_output。put_line('沒有這樣的老師!');
當別人
dbms_output.put_line(“錯誤!”);
結束;/ Output: Enter value for tt_id: 0(讓我們輸入一個值0)old 2: t_id teachers。Id %type:= &tt_id;新2:t_id教師。Id %type:= 0;ID必須大於零!PL/SQL過程成功完成。
預定義的異常
有預定義的異常,當程序違反任何數據庫規則時執行這些異常。
異常 |
甲骨文的錯誤 |
SQL代碼 |
描述 |
ACCESS_INTO_NULL |
06530 |
-6530年 |
當空對象被自動賦值時將被引發。 |
CASE_NOT_FOUND |
06592 |
-6592年 |
當CASE語句的when子句中沒有選擇任何選項,並且也沒有else子句時,將引發該異常。 |
COLLECTIONS_IS_NULL |
06531 |
-6531年 |
當程序試圖將除exists以外的集合方法應用到未初始化的VARRAY嵌套表時,將引發此問題。 |
DUP_VAL_ON_INDEX |
00001 |
-1 |
當試圖將重複元素存儲在具有唯一索引的列中時,將引發此異常。 |
INVALID_CURSOR |
01001 |
-1001年 |
當試圖進行不允許的遊標操作時將引發此異常。 |
INVALID_NUMBER |
01722 |
-1722年 |
當將字符串轉換為數字失敗時將引發此異常。 |
LOGIN_DENIED |
01017 |
-1017年 |
當程序試圖使用無效的用戶名和密碼登錄時,將引發此問題。 |
NO_DATA_FOUND |
01403 |
+ 100 |
當SELECTINTO語句不返回任何行時,將引發此異常。 |
NOT_LOGGED_ON |
01012 |
-1012年 |
在數據庫問題調用時被引發。 |
PROGRAM_ERROR |
06501 |
-6501年 |
這是由於PL/SQL的內部問題引起的。 |
ROWTYPE_MISMATCH |
06504 |
-6504年 |
如果遊標從具有不兼容數據類型的變量中獲取值。 |
SELF_IS_NULL |
30625 |
-30625年 |
當調用成員方法時,將引發該成員方法。 |
STORAGE_ERROR |
06500 |
-6500年 |
如果內存損壞,或者PL/SQL正在運行程序,則會引發該異常。 |
TOO_MANY_ERRORS |
01422 |
-1422年 |
當SELECTINTO語句返回多行時將引發此異常。 |
VALUE_ERROR |
06502 |
-6502年 |
由於算術、轉換或截斷錯誤而引發。 |
ZERO_DIVIDE |
01476 |
1476 |
當一個數除以0時是上升的。 |