RAISE_APPLICATION_ERROR

sudn發表於2011-06-26

平時用來測試的異常處理
我們都是通過dbms_output.put_line來輸出異常資訊,但是在實際的應用中,需要把異常資訊返回給呼叫的客戶端。
其實 RAISE_APPLICATION_ERROR 是將應用程式專有的錯誤從伺服器端轉達到客戶端應用程式(其他機器上的SQLPLUS或者其他前臺開發語言)

raise_application_error(異常型別,傳遞資訊)

異常型別:number() 值域:-20000 -20999

傳遞資訊:varchar22000

DBMS_STANDARD包的RAISE_APPLICATION_ERROR過程,可以重新定義異常錯誤訊息,它為應用程式提供了一種與ORACLE互動的方法。語法如下

RAISE_APPLICATION_ERROR(errorNumber,errorString)

errorNumber是數值在-20000-20999之間,errorString為自定義的錯誤資訊。

如:

update jobs set job_title = v_newJobTitle where job_id = v_jobid;

if sql%notfound then

   RAISE_APPLICATION_ERROR(-20167,'update failure!');

end if;

..........

當在sqlpus中測試時,一旦沒有要更新的行,則丟擲這樣的異常:

ORA-20167: update failure!

oracle的異常分為編譯時異常(錯誤)和執行時異常,前者不能被處理,後者可以被處理。
我們主要討論執行時異常。

異常型別:
a
、預定義異常
     
已命名的預定義異常有CURSOR_ALREADY_OPENINVALID_NUMBERTOO_MANY_ROWS
b
、使用者定義異常
c
、已命名異常(已命名異常不能單獨歸為一類異常,但它有點特別,所以我將它單獨羅列說明)
     
如果希望處理一個異常(when子串處理),那麼異常必須有一個名字,如TOO_MANY_ROWS
     
資料庫錯誤有數千個,但是隻有不到25個是內建的已命名異常(這些異常都宣告在standard包中)
     
要處理那些未命名的異常時,你可以將一個名字和一個錯誤號聯絡在一起,達到這個目的的語句是pragma exception_init語句;

丟擲異常:
a
、通過pl/sql執行時引擎
     
當資料庫或pl/sql在執行時發生錯誤時,一個異常被pl/sql執行時引擎自動丟擲
b
、使用raise語句
     
異常也可以通過raise語句丟擲:raise exception_name;
c
、呼叫raise_application_error儲存過程

處理異常&異常傳播:
a
、一旦程式進入異常部分就不能再回到同一塊的執行部分;當異常被處理後,控制返回到外層執行部分的下一條語句;
b
、如果有when others子串,則必須放置在最後面作為預設處理器處理沒有顯式處理的異常;
c
、執行部分丟擲的異常將首先傳遞到同一塊的異常部分,如果在同一塊的異常部分沒有處理這個異常的處理器,那麼異常將會傳播到上一層的異常部分中,一直到最外層;
d
、異常被處理後如果你仍然希望它繼續傳播,可以在異常處理的最後執行不帶引數的raise語句(raise語句將重新丟擲出現的異常,允許它繼續傳播)

--這是一個上面部分知識點的示例(虛擬碼)說明
declare
...
user_define_exception exception; --
使用者定義異常
invalid_column_name exception;
--
補充說明:如果我們在程式塊中使用了無效列名,會有括號中的錯誤提示(ORA-00904:invalid column name)
--
下面我們將這個異常程式碼號與我們自定義的異常進行關聯,即為異常命名
pragma exception_init(invalid_column_name,-904);
begin
...
--raise user_define_exception; --
可以顯式引發異常
exception
when TOO_MANY_ROWS then --
預定義異常處理
    ...;
when user_define_exception then --
使用者定義異常處理
    ...;
when invalid_column_name then --PRAGMA EXCEPTION_INIT
異常處理
    ...;
    raise;    --
繼續傳播該異常
end;

sqlcodesqlerrm
a
、另外一種處理資料庫錯誤的方法是使用內建函式sqlcodesqlerrm
b
sqlcode將返回現行資料庫錯誤號,這些錯誤號中除了no_data_found+100外其他都是負數;
c
sqlerrm返回文字描述的錯誤資訊;
d
、為了獲得使用者自定義異常返回的sqlerrmsqlcode,你需要使用raise_application_error函式給自定義異常標註錯誤號

給自定義錯誤標註號碼:
a
raise_application_error內建函式用於丟擲一個異常並給異常賦予一個錯誤號以及錯誤資訊;
b
、自定義異常的預設錯誤號是+1,預設資訊是user_defined_exception。來自未處理的異常的一般資訊對於識別導致錯誤的原因沒有幫助,
c
raise_application_error函式能夠在pl/sql程式塊的執行部分和異常部分呼叫,顯式丟擲帶特殊錯誤號的命名異常;
d
、使用語法:raise_application_error(error_no,error_message[,{true|| false}]);
e
、錯誤號的範圍是-20,001-20,999;錯誤資訊是文字字串,最多為2048位元組;truefalse表示是新增(true)進錯誤堆(error stack)還是覆蓋(overwrite)錯誤堆(false)。預設情況下是false

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16860121/viewspace-700753/,如需轉載,請註明出處,否則將追究法律責任。