日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle入门(十四.15)之捕获Oracle服务器异常

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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服務器錯誤。 請注意,它未在聲明部分中聲明。

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); EXCEPTIONWHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE (' Your select statement retrieved multiple rows. Consider using a cursor.'); END;

此示例處理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語句中的變量,如以下示例中所示:

DECLAREv_error_code NUMBER;v_error_message VARCHAR2(255); BEGIN ... EXCEPTIONWHEN OTHERS THENROLLBACK;v_error_code := SQLCODE ;v_error_message := SQLERRM ;INSERT INTO error_log(e_user,e_date,error_code,error_message) VALUES(USER,SYSDATE,v_error_code,v_error_message); END;





總結

以上是生活随笔為你收集整理的Oracle入门(十四.15)之捕获Oracle服务器异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。