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語句在可執行部分中明確地引發異常。
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服務器錯誤一致。
(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)之捕获用户定义的异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle入门(十四.15)之捕获Or
- 下一篇: OPPO Find X6 系列手机再开启