平時用來測試的異常處理
咱們都是經過dbms_output.put_line來輸出異常信息,可是在實際的應用中,須要把異常信息返回給調用的客戶端。
其實 RAISE_APPLICATION_ERROR 是將應用程序專有的錯誤從服務器端轉達到客戶端應用程序(其餘機器上的SQLPLUS或者其餘前臺開發語言)sql
raise_application_error(異常類型,傳遞信息)數據庫
異常類型:number 值域:-20000 到-20999服務器
傳遞信息:varchar2(2000)oracle
DBMS_STANDARD包的RAISE_APPLICATION_ERROR過程,能夠從新定義異常錯誤消息,它爲應用程序提供了一種與ORACLE交互的方法。語法以下app
RAISE_APPLICATION_ERROR(errorNumber,errorString)函數
errorNumber是數值在-20000到-20999之間,errorString爲自定義的錯誤信息。測試
如:code
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_OPEN、INVALID_NUMBER、TOO_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;
sqlcode和sqlerrm:
a、另一種處理數據庫錯誤的方法是使用內建函數sqlcode和sqlerrm;
b、sqlcode將返回現行數據庫錯誤號,這些錯誤號中除了no_data_found是+100外其餘都是負數;
c、sqlerrm返回文本描述的錯誤信息;
d、爲了得到用戶自定義異常返回的sqlerrm和sqlcode,你須要使用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字節;true和false表示是添加(true)進錯誤堆(error stack)仍是覆蓋(overwrite)錯誤堆(false)。缺省狀況下是false。