Oracle入门(十四.15)之捕获Oracle服务器异常
一、異常類型
本課討論預定義和非預定義的Oracle服務器異常。
(1)使用PL / SQL處理異常
有兩種提出異常的方法:?Oracle服務器隱式(自動):
- 發生Oracle錯誤并自動引發相關異常。
- 例如,如果在SELECT語句中沒有從數據庫中檢索行時發生錯誤ORA-01403,則PL / SQL引發異常NO_DATA_FOUND。
?程序員明確指出:
- 根據您的程序正在執行的業務功能,您可能必須明確提出異常。
- 通過在塊內發出RAISE語句顯式引發異常。
- 引發的異常可以是用戶定義的或預定義的。 這些在下一課中解釋。
(2)兩種類型的Oracle服務器錯誤
????當發生Oracle服務器錯誤時,Oracle服務器會自動引發關聯的異常,跳過塊的可執行部分的其余部分,并在異常部分查找處理程序。
有兩種類型的Oracle服務器錯誤:
?預定義的Oracle服務器錯誤:
- 每個錯誤都有一個預定義的名稱。
- 例如,如果在SELECT語句中沒有從數據庫中檢索到行時發生錯誤ORA-01403,則PL / SQL會引發預定義的異常名稱NO_DATA_FOUND。
?非預定義的Oracle服務器錯誤:
- 這些錯誤中的每一個都有一個標準的Oracle錯誤編號(ORA-nnnnn)和錯誤消息,但不是預定義的名稱。
- 為這些名稱聲明自己的名稱,以便可以在異常部分中引用這些名稱。
(3)捕獲預定義的Oracle服務器錯誤
在異常處理例程中引用預定義的名稱。?預定義例外示例:
- NO_DATA_FOUND
- TOO_MANY_ROWS
- INVALID_CURSOR
- ZERO_DIVIDE
- DUP_VAL_ON_INDEX
有關預定義例外的部分列表,請參閱第0部分中的學生資源中提供的簡短列表。
有關預定義例外的完整列表,請參閱PL / SQL用戶指南和參考。
以下示例使用TOO_MANY_ROWS預定義的Oracle服務器錯誤。 請注意,它未在聲明部分中聲明。
此示例處理TOO_MANY_ROWS和NO_DATA_FOUND,并在出現任何其他錯誤時使用OTHERS處理程序。
DECLAREv_lname VARCHAR2(15); BEGINSELECT last_name INTO v_lnameFROM employees WHERE job_id = 'ST_CLERK';DBMS_OUTPUT.PUT_LINE('The last name of the ST_CLERK is: '||v_lname); EXCEPTION WHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE ('Select statement found multiple rows');WHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE ('Select statement found no rows');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE ('Another type of error occurred'); END;捕獲非預定義的Oracle服務器錯誤非預定義的例外與預定義的例外類似; 但是,它們在PL / SQL中沒有預定義的名稱。 它們是標準的Oracle服務器錯誤,并具有ORA錯誤編號。
可以在DECLARE部分為他們創建自己的名稱,并使用PRAGMA EXCEPTION_INIT函數將這些名稱與ORA-錯誤號相關聯。
?可以通過首先聲明它來捕獲非預定義的Oracle服務器錯誤。 聲明的異常是隱含提出的。 在PL / SQL中,PRAGMA EXCEPTION_INIT指示編譯器將異常名稱與Oracle錯誤號關聯。
?這允許通過名稱引用任何Oracle Server異常并為其編寫特定的處理程序。
二、非預定義錯誤
檢查以下示例。
BEGIN INSERT INTO departments(department_id, department_name) VALUES (280, NULL); END;ORA-01400: cannot insert NULL into (“USVA_TEST_SQL01_S01”.“DEPARTMENTS”. “DEPARTMENT_NAME”)INSERT語句嘗試插入department表的department_name列的值NULL。但是,操作不成功,因為department_name是NOT NULL列。 沒有違反NOT NULL約束的預定義錯誤名稱。解決此問題的方法是聲明您自己的名稱并將其與ORA-01400錯誤關聯。
1.在聲明部分聲明異常的名稱。
2.使用PRAGMA EXCEPTION_INIT函數將聲明的異常與標準Oracle服務器錯誤號相關聯。
3.在相應的異常處理例程中引用聲明的異常名稱。
三、捕獲異常的函數
發生異常時,可以使用兩個函數檢索相關的錯誤代碼或錯誤消息。根據代碼或消息的值,您可以決定采取哪些后續操作。
?SQLERRM返回包含與錯誤編號關聯的消息的字符數據。
?SQLCODE返回錯誤代碼的數字值。 (您可以將其分配給NUMBER變量。)
不能在SQL語句中直接使用SQLCODE或SQLERRM。 相反,您必須將它們的值分配給本地變量,然后使用SQL語句中的變量,如以下示例中所示:
總結
以上是生活随笔為你收集整理的Oracle入门(十四.15)之捕获Oracle服务器异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美光在马来西亚启用其最先进的组装和测试工
- 下一篇: Oracle入门(十四.16)之捕获用户