自定義PL/SQL異常

realkid4發表於2011-02-24

 

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章