oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之异常处理
平時(shí)用來測(cè)試的異常處理
我們都是通過dbms_output.put_line來輸出異常信息,但是在實(shí)際的應(yīng)用中,需要把異常信息返回給調(diào)用的客戶端。
其實(shí) RAISE_APPLICATION_ERROR 是將應(yīng)用程序?qū)S械腻e(cuò)誤從服務(wù)器端轉(zhuǎn)達(dá)到客戶端應(yīng)用程序(其他機(jī)器上的SQLPLUS或者其他前臺(tái)開發(fā)語(yǔ)言)
raise_application_error(異常類型,傳遞信息)
異常類型:number 值域:-20000 到-20999
傳遞信息:varchar2(2000)
DBMS_STANDARD包的RAISE_APPLICATION_ERROR過程,可以重新定義異常錯(cuò)誤消息,它為應(yīng)用程序提供了一種與ORACLE交互的方法。語(yǔ)法如下
RAISE_APPLICATION_ERROR(errorNumber,errorString)
errorNumber是數(shù)值在-20000到-20999之間,errorString為自定義的錯(cuò)誤信息。
如:
update jobs set job_title = v_newJobTitle where job_id = v_jobid;
if sql%notfound then
RAISE_APPLICATION_ERROR(-20167,'update failure!');
end if;
..........
當(dāng)在sqlpus中測(cè)試時(shí),一旦沒有要更新的行,則拋出這樣的異常:
ORA-20167: update failure!
oracle的異常分為編譯時(shí)異常(錯(cuò)誤)和運(yùn)行時(shí)異常,前者不能被處理,后者可以被處理。
我們主要討論運(yùn)行時(shí)異常。
異常類型:
a、預(yù)定義異常
已命名的預(yù)定義異常有CURSOR_ALREADY_OPEN、INVALID_NUMBER、TOO_MANY_ROWS等
b、用戶定義異常
c、已命名異常(已命名異常不能單獨(dú)歸為一類異常,但它有點(diǎn)特別,所以我將它單獨(dú)羅列說明)
如果希望處理一個(gè)異常(被when子串處理),那么異常必須有一個(gè)名字,如TOO_MANY_ROWS;
數(shù)據(jù)庫(kù)錯(cuò)誤有數(shù)千個(gè),但是只有不到25個(gè)是內(nèi)建的已命名異常(這些異常都聲明在standard包中);
要處理那些未命名的異常時(shí),你可以將一個(gè)名字和一個(gè)錯(cuò)誤號(hào)聯(lián)系在一起,達(dá)到這個(gè)目的的語(yǔ)句是pragma exception_init語(yǔ)句;
拋出異常:
a、通過pl/sql運(yùn)行時(shí)引擎
當(dāng)數(shù)據(jù)庫(kù)或pl/sql在運(yùn)行時(shí)發(fā)生錯(cuò)誤時(shí),一個(gè)異常被pl/sql運(yùn)行時(shí)引擎自動(dòng)拋出
b、使用raise語(yǔ)句
異常也可以通過raise語(yǔ)句拋出:raise exception_name;
c、調(diào)用raise_application_error存儲(chǔ)過程
處理異常&異常傳播:
a、一旦程序進(jìn)入異常部分就不能再回到同一塊的執(zhí)行部分;當(dāng)異常被處理后,控制返回到外層執(zhí)行部分的下一條語(yǔ)句;
b、如果有when others子串,則必須放置在最后面作為缺省處理器處理沒有顯式處理的異常;
c、執(zhí)行部分拋出的異常將首先傳遞到同一塊的異常部分,如果在同一塊的異常部分沒有處理這個(gè)異常的處理器,那么異常將會(huì)傳播到上一層的異常部分中,一直到最外層;
d、異常被處理后如果你仍然希望它繼續(xù)傳播,可以在異常處理的最后執(zhí)行不帶參數(shù)的raise語(yǔ)句(raise語(yǔ)句將重新拋出出現(xiàn)的異常,允許它繼續(xù)傳播);
--這是一個(gè)上面部分知識(shí)點(diǎn)的示例(偽代碼)說明
declare
...
user_define_exception exception; --用戶定義異常
invalid_column_name exception;
--補(bǔ)充說明:如果我們?cè)诔绦驂K中使用了無效列名,會(huì)有括號(hào)中的錯(cuò)誤提示(ORA-00904:invalid column name)
--下面我們將這個(gè)異常代碼號(hào)與我們自定義的異常進(jìn)行關(guān)聯(lián),即為異常命名
pragma exception_init(invalid_column_name,-904);
begin
...
--raise user_define_exception; --可以顯式引發(fā)異常
exception
when TOO_MANY_ROWS then --預(yù)定義異常處理
...;
when user_define_exception then --用戶定義異常處理
...;
when invalid_column_name then --PRAGMA EXCEPTION_INIT異常處理
...;
raise; --繼續(xù)傳播該異常
end;
sqlcode和sqlerrm:
a、另外一種處理數(shù)據(jù)庫(kù)錯(cuò)誤的方法是使用內(nèi)建函數(shù)sqlcode和sqlerrm;
b、sqlcode將返回現(xiàn)行數(shù)據(jù)庫(kù)錯(cuò)誤號(hào),這些錯(cuò)誤號(hào)中除了no_data_found是+100外其他都是負(fù)數(shù);
c、sqlerrm返回文本描述的錯(cuò)誤信息;
d、為了獲得用戶自定義異常返回的sqlerrm和sqlcode,你需要使用raise_application_error函數(shù)給自定義異常標(biāo)注錯(cuò)誤號(hào)
給自定義錯(cuò)誤標(biāo)注號(hào)碼:
a、raise_application_error內(nèi)建函數(shù)用于拋出一個(gè)異常并給異常賦予一個(gè)錯(cuò)誤號(hào)以及錯(cuò)誤信息;
b、自定義異常的缺省錯(cuò)誤號(hào)是+1,缺省信息是user_defined_exception。來自未處理的異常的一般信息對(duì)于識(shí)別導(dǎo)致錯(cuò)誤的原因沒有幫助,
c、raise_application_error函數(shù)能夠在pl/sql程序塊的執(zhí)行部分和異常部分調(diào)用,顯式拋出帶特殊錯(cuò)誤號(hào)的命名異常;
d、使用語(yǔ)法:raise_application_error(error_no,error_message[,{true|| false}]);
e、錯(cuò)誤號(hào)的范圍是-20,001到-20,999;錯(cuò)誤信息是文本字符串,最多為2048字節(jié);true和false表示是添加(true)進(jìn)錯(cuò)誤堆(error stack)還是覆蓋(overwrite)錯(cuò)誤堆(false)。缺省情況下是false。
總結(jié)
以上是生活随笔為你收集整理的oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle解析儒略日,利用to_cha
- 下一篇: ai驱动数据安全治理_AI驱动的Web数