日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之异常处理

發(fā)布時間:2023/11/29 ChatGpt 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之异常处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

平時用來測試的異常處理

我們都是通過dbms_output.put_line來輸出異常信息,但是在實際的應(yīng)用中,需要把異常信息返回給調(diào)用的客戶端。

其實 RAISE_APPLICATION_ERROR 是將應(yīng)用程序?qū)S械腻e誤從服務(wù)器端轉(zhuǎn)達到客戶端應(yīng)用程序(其他機器上的SQLPLUS或者其他前臺開發(fā)語言)

raise_application_error(異常類型,傳遞信息)

異常類型:number 值域:-20000 到-20999

傳遞信息:varchar2(2000)

DBMS_STANDARD包的RAISE_APPLICATION_ERROR過程,可以重新定義異常錯誤消息,它為應(yīng)用程序提供了一種與ORACLE交互的方法。語法如下

RAISE_APPLICATION_ERROR(errorNumber,errorString)

errorNumber是數(shù)值在-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;

..........

當(dāng)在sqlpus中測試時,一旦沒有要更新的行,則拋出這樣的異常:

ORA-20167: update failure!

oracle的異常分為編譯時異常(錯誤)和運行時異常,前者不能被處理,后者可以被處理。

我們主要討論運行時異常。

異常類型:

a、預(yù)定義異常

已命名的預(yù)定義異常有CURSOR_ALREADY_OPEN、INVALID_NUMBER、TOO_MANY_ROWS等

b、用戶定義異常

c、已命名異常(已命名異常不能單獨歸為一類異常,但它有點特別,所以我將它單獨羅列說明)

如果希望處理一個異常(被when子串處理),那么異常必須有一個名字,如TOO_MANY_ROWS;

數(shù)據(jù)庫錯誤有數(shù)千個,但是只有不到25個是內(nèi)建的已命名異常(這些異常都聲明在standard包中);

要處理那些未命名的異常時,你可以將一個名字和一個錯誤號聯(lián)系在一起,達到這個目的的語句是pragma exception_init語句;

拋出異常:

a、通過pl/sql運行時引擎

當(dāng)數(shù)據(jù)庫或pl/sql在運行時發(fā)生錯誤時,一個異常被pl/sql運行時引擎自動拋出

b、使用raise語句

異常也可以通過raise語句拋出:raise exception_name;

c、調(diào)用raise_application_error存儲過程

處理異常&異常傳播:

a、一旦程序進入異常部分就不能再回到同一塊的執(zhí)行部分;當(dāng)異常被處理后,控制返回到外層執(zhí)行部分的下一條語句;

b、如果有when others子串,則必須放置在最后面作為缺省處理器處理沒有顯式處理的異常;

c、執(zhí)行部分拋出的異常將首先傳遞到同一塊的異常部分,如果在同一塊的異常部分沒有處理這個異常的處理器,那么異常將會傳播到上一層的異常部分中,一直到最外層;

d、異常被處理后如果你仍然希望它繼續(xù)傳播,可以在異常處理的最后執(zhí)行不帶參數(shù)的raise語句(raise語句將重新拋出出現(xiàn)的異常,允許它繼續(xù)傳播);

--這是一個上面部分知識點的示例(偽代碼)說明

declare

...

user_define_exception exception; --用戶定義異常

invalid_column_name exception;

--補充說明:如果我們在程序塊中使用了無效列名,會有括號中的錯誤提示(ORA-00904:invalid column name)

--下面我們將這個異常代碼號與我們自定義的異常進行關(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ù)庫錯誤的方法是使用內(nèi)建函數(shù)sqlcode和sqlerrm;

b、sqlcode將返回現(xiàn)行數(shù)據(jù)庫錯誤號,這些錯誤號中除了no_data_found是+100外其他都是負數(shù);

c、sqlerrm返回文本描述的錯誤信息;

d、為了獲得用戶自定義異常返回的sqlerrm和sqlcode,你需要使用raise_application_error函數(shù)給自定義異常標(biāo)注錯誤號

給自定義錯誤標(biāo)注號碼:

a、raise_application_error內(nèi)建函數(shù)用于拋出一個異常并給異常賦予一個錯誤號以及錯誤信息;

b、自定義異常的缺省錯誤號是+1,缺省信息是user_defined_exception。來自未處理的異常的一般信息對于識別導(dǎo)致錯誤的原因沒有幫助,

c、raise_application_error函數(shù)能夠在pl/sql程序塊的執(zhí)行部分和異常部分調(diào)用,顯式拋出帶特殊錯誤號的命名異常;

d、使用語法:raise_application_error(error_no,error_message[,{true|| false}]);

e、錯誤號的范圍是-20,001到-20,999;錯誤信息是文本字符串,最多為2048字節(jié);true和false表示是添加(true)進錯誤堆(error stack)還是覆蓋(overwrite)錯誤堆(false)。缺省情況下是false。

總結(jié)

以上是生活随笔為你收集整理的oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。