自定義PL/SQL異常
在PL/SQL程式碼中,我們除了可以使用Oracle預定義的Exception,還可以自定義屬於自己的異常。但是,使用自定義異常要注意的是,異常的宣告、定義和丟擲場景,都是要編寫者手工自己完成。
宣告異常型別變數
PL/SQL中,異常Exception可以作為一種變數型別使用。如果需要使用自定義異常,則首先需要在declare宣告段中宣告出異常型別變數。宣告使用EXCEPTION關鍵字進行。
當我們需要將這個異常丟擲的時候,只需要使用raise語句。就可以直接中斷當前的程式碼執行流程,進入Exception處理程式碼段。在異常處理段中,使用when進行系列匹配,將匹配上的異常變數進行攔截。見下面程式碼示例:
set serveroutput on size 10000;
set timing on;
declare
n_count number;
too_many exception; --定義一個異常型別變數;
begin
select count(*)
into n_count
from dba_objects;
if (n_count>10000) then
raise too_many; --使用raise丟擲異常;
end if;
dbms_output.put_line('Normal Stop !');
exception
when no_data_found then
dbms_output.put_line('No Data Found !');
when too_many then --使用變數名稱進行攔截
dbms_output.put_line('User-Defined Exception found : too_many');
when others then
dbms_output.put_line('Other Happened !');
end;
/
輸出結果:
SQL>
User-Defined Exception found : too_many
PL/SQL procedure successfully completed
Executed in 0.09 seconds
說明一點,我們在使用自定義異常的使用。一定要進行異常的丟擲,而且是顯示的進行異常丟擲。對比Oracle預定義異常,這個差異很大。預定義的異常,是Oracle自己進行檢測,並且丟擲。而使用者自定義的異常經常是從業務角度看的特殊流程,所以必然是需要手工的進行異常丟擲。
自定義異常資訊的錯誤程式碼
Oracle的預定義異常,都有一個負整數的錯誤程式碼,如ORA-0001。自定義異常,我們也是可以定義配置一個錯誤程式碼的。在進行繫結的時候,我們需要在異常宣告出使用PRAGMA EXCEPTION_INIT關鍵字。
declare
n_count number;
too_many exception;
pragma exception_init(too_many,-20010); --將too_many異常與-20010程式碼繫結上;
begin
select count(*)
into n_count
from dba_objects;
if (n_count>10000) then
raise too_many;
end if;
dbms_output.put_line('Normal Stop !');
exception
when others then
--既然實現了繫結,也就是可以進行輸出錯誤編碼!
dbms_output.put_line('Some Happened ! ORA'||sqlcode||'-- '||sqlerrm);
end;
/
執行結果:
SQL>
Some Happened ! ORA-20010-- ORA-20010:
PL/SQL procedure successfully completed
Executed in 0.11 seconds
如此,我們就實現了將一個自定義錯誤與一個數字進行繫結的需求。此處注意一下,Oracle預定義異常已經佔用了很多ORA-XXXXX錯誤編號,為自定義異常預留的號段為:-20000到-20999。我們自定義使用時要注意錯誤編號的範圍。
對異常資訊進行資訊輸出
至此,我們實現了自定義異常的定義、捕獲和錯誤編碼關聯。還有一個功能,就是錯誤資訊提示。我們常常需要在報出這個錯誤的時候,輸出一些資訊來幫助我們進行調錯。一個簡單的message提示,會大大加快我們debug的速度。
我們剛剛使用raise關鍵字進行丟擲異常,如果需要加入提示資訊,就需要使用raise_application_error函式。示例如下:
set serveroutput on size 10000;
set timing on;
declare
n_count number;
too_many exception;
pragma exception_init(too_many,-20010);
begin
select count(*)
into n_count
from dba_objects;
if (n_count>10000) then
--將錯誤編碼-20010的編碼錯誤丟擲(也就是too_many),並且提示出錯誤資訊;
raise_application_error(-20010,'User Defined Too many Exception !');
end if;
dbms_output.put_line('Normal Stop !');
exception
when too_many then
dbms_output.put_line('TOO_MANY Happen : '||sqlerrm);
when others then
dbms_output.put_line('Some Happened ! ORA'||sqlcode||'-- '||sqlerrm);
end;
/
輸出結果:
SQL>
//too_many在when中攔截住了錯誤,輸出了自定義資訊!
TOO_MANY Happen : ORA-20010: User Defined Too many Exception !
PL/SQL procedure successfully completed
Executed in 0.111 seconds
當然,我們也可以不使用異常宣告,直接丟擲異常。
declare
n_count number; --我們沒有宣告錯誤變數,沒有繫結編碼
begin
select count(*)
into n_count
from dba_objects;
if (n_count>10000) then
--直接丟擲錯誤
raise_application_error(-20010,'User Defined Too many Exception !');
end if;
dbms_output.put_line('Normal Stop !');
exception
when others then –使用通常攔截
dbms_output.put_line('Some Happened ! '||sqlerrm);
end;
/
輸出結果:
SQL>
Some Happened ! ORA-20010: User Defined Too many Exception !
PL/SQL procedure successfully completed
Executed in 0.07 seconds
到此,我們已經可以獲得自定義異常錯誤的全部結論。
ü 如果你希望丟擲異常後,針對不同的異常進行不同的邏輯處理,在Exception中分類攔截出來。那麼,請宣告出一個異常型別變數;
ü 如果你希望你的宣告異常有一個編碼與之對應。請使用pragma exception_init將一個預定義數字與其繫結住;
ü 如果你希望在丟擲異常錯誤中,帶有一些提示自定義資訊。那就是用raise_application_error方法,將錯誤編碼和提示資訊一併丟擲;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-687896/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 自定義異常
- PL/SQL 08 異常 exceptionSQLException
- PL SQL異常處理.SQL
- Pl/SQL 自定義型別SQL型別
- Java 異常(二) 自定義異常Java
- 自定義異常類
- Java自定義異常Java
- 自定義異常三
- restframework 異常處理及自定義異常RESTFramework
- PL/SQL異常處理初步(轉)SQL
- Java之自定義異常Java
- PL/SQL 事務持久化異常 / PL/SQL commit優化SQL持久化MIT優化
- (轉)pl/sql開發異常處理SQL
- springboot自定義異常Spring Boot
- Java的自定義異常類Java
- 使用者自定義異常
- C#規範整理·異常與自定義異常C#
- 異常-自定義異常的實現和測試
- python自定義異常,使用raise引發異常PythonAI
- C#自定義異常 統一異常處理C#
- pl/sql中錯誤的異常處理SQL
- 【Django】DRF自定義異常處理Django
- C#中自定義異常類C#
- Oracle自定義異常的使用薦Oracle
- pl/sql 異常處理的概念和術語SQL
- 自定義UDF函式應用異常函式
- Oracle 11g PL/SQL 使用者自定義 ExceptionOracleSQLException
- 物件導向 約束、自定義異常、加密物件加密
- Java學習筆記之自定義異常Java筆記
- 2024.10.11(自定義異常)
- Oracle PL/SQL語言初級教程之異常處理OracleSQL
- Spring Cloud Gateway-自定義異常處理SpringCloudGateway
- Java自定義異常的建立及多層呼叫Java
- 用列舉來處理java自定義異常Java
- Java異常處理的兩種方式以及自定義異常的使用方法Java
- springboot下新增全域性異常處理和自定義異常處理Spring Boot
- 【PL/SQL開發】-----詭異啊SQL
- SpringBoot系列——自定義統一異常處理Spring Boot