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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Oracle入门(十四.16)之捕获用户定义的异常

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle入门(十四.16)之捕获用户定义的异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、異常類型

本文討論用戶定義的錯誤。



二、捕獲用戶定義的異常

PL / SQL允許你定義你自己的異常。 您根據應用程序的要求定義異常。


輸入數據期間需要用戶定義的異常的一個示例。 假設您的程序提示用戶輸入部門編號和名稱,以便它可以更新部門的名稱。 當用戶進入無效部門時會發生什么? 該代碼不會產生Oracle錯誤。 你需要定義一個預定義的用戶錯誤來引發錯誤。

DECLAREv_name VARCHAR2(20):='Accounting';v_deptno NUMBER := 27; BEGINUPDATE departmentsSET department_name = v_nameWHERE department_id = v_deptno; END;

當用戶進入無效部門時會發生什么??

編寫的代碼不會產生Oracle錯誤。 需要定義一個預定義的用戶錯誤來引發錯誤。?

可以這樣做:

1.在聲明部分聲明用戶定義的異常的名稱。

e_invalid_department EXCEPTION;

2.使用RAISE語句在可執行部分中明確地引發異常。

IF SQL%NOTFOUND THEN RAISE e_invalid_department;

3.在相應的異常處理例程中引用聲明的異常。

EXCEPTIONWHEN e_invalid_department THENDBMS_OUTPUT.PUT_LINE('No such department id.');

以下是完整的代碼。


1.在聲明部分中聲明用戶定義的異常的名稱。 語法:exception EXCEPTION; exception是異常的名稱。

2.使用RAISE語句在可執行部分中顯式引發異常。 語法:RAISE exception; 其中exception是先前聲明的異常。

3.在相應的異常處理例程中引用已聲明的異常。


三、RAISE聲明

可以使用RAISE語句來引發一個指定的異常。 你可以提出:

?自己的異常(即用戶定義的異常)

IF v_grand_total=0 THENRAISE e_invalid_total; ELSE DBMS_OUTPUT.PUT_LINE(v_num_students/v_grand_total); END IF;

?Oracle服務器錯誤

IF v_grand_total=0 THENRAISE ZERO_DIVIDE; ELSEDBMS_OUTPUT.PUT_LINE(v_num_students/v_grand_total); END IF;


四、RAISE_APPLICATION_ERROR過程

????可以使用RAISE_APPLICATION_ERROR過程從存儲的子程序返回用戶定義的錯誤消息。

????使用RAISE_APPLICATION_ERROR而不是RAISE的主要優點是RAISE_APPLICATION_ERROR允許您將自己的錯誤號和有意義的消息與異常關聯。

錯誤編號必須介于-20000和-20999之間。

(1)語法:

RAISE_APPLICATION_ERROR (error_number, message[, {TRUE | FALSE}]);?error_number是-20000和-20999之間的異常的用戶指定編號
?消息是異常的用戶指定消息。 它是一個長達2048字節的字符串。

?TRUE | FALSE是一個可選的布爾參數。?

(如果為TRUE,則將錯誤放置在之前錯誤的堆棧上。如果FALSE-默認 - 錯誤將替換以前的所有錯誤。)

數字范圍-20000到-20999由Oracle保留供程序員使用,并且從不用于預定義的Oracle Server錯誤。

(2)可以在兩個不同的地方使用RAISE_APPLICATION_ERROR:
?可執行部分
?異常部分

(3)可執行部分中的RAISE_APPLICATION_ERROR
被調用時,RAISE_APPLICATION_ERROR過程向用戶顯示錯誤號和消息。 此過程與其他Oracle服務器錯誤一致。

DECLAREv_mgr PLS_INTEGER := 123; BEGINDELETE FROM employeesWHERE manager_id = v_mgr;IF SQL%NOTFOUND THENRAISE_APPLICATION_ERROR(-20202, 'This is not a valid manager');END IF; END;

(4)異常部分中的RAISE_APPLICATION_ERROR

DECLAREv_mgr PLS_INTEGER := 27;v_employee_id employees.employee_id%TYPE; BEGINSELECT employee_id into v_employee_idFROM employeesWHERE manager_id = v_mgr;DBMS_OUTPUT.PUT_LINE('The employee who works for manager_id '||v_mgr||' is: '||v_employee_id); EXCEPTIONWHEN NO_DATA_FOUND THENRAISE_APPLICATION_ERROR (-20201, 'This manager has no employees');WHEN TOO_MANY_ROWS THENRAISE_APPLICATION_ERROR (-20202,'Too many employees were found.'); END;

(5)將RAISE_APPLICATION_ERROR與用戶定義的異常一起使用

DECLAREe_name EXCEPTION;PRAGMA EXCEPTION_INIT (e_name, -20999);v_last_name employees.last_name%TYPE := 'Silly Name'; BEGINDELETE FROM employees WHERE last_name = v_last_name;IF SQL%ROWCOUNT =0 THENRAISE_APPLICATION_ERROR(-20999,'Invalid last name');ELSEDBMS_OUTPUT.PUT_LINE(v_last_name||' deleted');END IF; EXCEPTION WHEN e_name THENDBMS_OUTPUT.PUT_LINE ('Valid last names are: ');FOR c1 IN (SELECT DISTINCT last_name FROM employees)LOOPDBMS_OUTPUT.PUT_LINE(c1.last_name);END LOOP;WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('Error deleting from employees'); END;


總結

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

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