DB2儲存過程的異常處理

2022-02-02 12:57:15 字數 3903 閱讀 9451

1、自定義異常 

declare condition  

for sqlstate ; 

注: 可以從7-9或t-z開頭

2、異常捕捉 

declare exit | continue | undo 

handler for 異常 | sqlstate

begin 

get diagnostics exception 1 sqlerrm = message_text; -- 取得錯誤資訊

values (sqlcode, sqlstate, sqlerrm) into 《變數》 , 《變數》, 《變數》; 

-- 獲取sqlcode,selstate,sqlerrm資訊到變數中 

end; 

注:exit;只跳轉出handler定義所在的begin 和 end的程式塊 

for 所捕捉的異常可以是:sqlexception,sqlwarning,not found,自定義異常

3、異常丟擲 

signal 拋出自定義異常或者是已經定義的異常

signal sqlstate [set message_text = ]; 丟擲異常,制定異常的sqlstate和異常資訊

resignal  用在異常控制代碼捕捉中,指把此異常拋到上一層。

resignal 和 signal 之間的區別在於,signal是在非handler處理邏輯中丟擲異常,而resignal則是在handler處理邏輯中丟擲異常。語法一致。 

4、注:procedure中能夠定義和捕捉異常,function中不支援異常處理。 

**:以下的文章主要向大家講述的是db2 儲存過程的異常處理方法,在db2資料庫中,假如你要使用sqlcode,那麼你就必須在ddl語句之前declare。這是我們大家都必須了解的,以下就是文章的主要內容描述。

儲存過程異常的處理:

declare handler-type handler for condition handler-action

異常處理器型別(handler-type)有以下幾種:

continue 在處理器操作完成之後,會繼續執行產生這個異常語句之後的下一條語句。

exit 在處理器操作完成之後,儲存過程會終止,並將控制返回給呼叫者。

undo 在處理器操作執行之前,db2會回滾儲存過程中執行的sql操作。在處理器操作完成之後,儲存過程會終止,並將控制返回給呼叫者。

異常處理器可以處理基於特定sqlstate值的定製異常,或者處理預定義異常的類。預定義的3種異常如下所示:

not found 標識導致sqlcode值為+100或者sqlsate值為02000的異常。這個異常通常在select沒有返回行的時候出現。

sqlexceptioin 標識導致sqlcode值為負的異常。

sqlwarning 標識導致警告異常或者導致+100以外的sqlcode正值的異常。

如果產生了not found 或者sqlwarning異常,並且沒有為這個異常定義異常處理器,那麼就會忽略這個異常,並且將控制流轉向下乙個語句。如果產生了sqlexception異常,並且沒有為這個異常定義異常處理器,那麼db2 儲存過程就會失敗,並且會將控制流返**用者。

以下示例宣告了兩個異常處理器。 exit處理器會在出現sqlexception 或者sqlwarning異常的時候被呼叫。exit處理器會在終止sql程式之前,將名為stmt的變數設為"aborted",並且將控制流返回給呼叫者。undo處理器會將控制流返回給呼叫者之前,回滾儲存過程體中已經完成的sql操作。

清單3:異常處理器示例

declare exit handler for sqlexception, sqlwarning set stmt = 'aborted';

declare undo handler for not found;

如果預定義異常集不能滿足需求,就可以為特定的sqlstate值宣告定製異常,然後再為這個定製異常宣告處理器。語法如下:

清單4:定製異常處理器

declare unique-name condition for sqlsate 'sqlstate'

處理器可以由單獨的儲存過程語句定義,也可以使用由begin…end塊界定的復合語句定義。注意在執行符合語句的時候,sqlsate和sqlcode的值會被改變,如果需要保留異常前的sqlsate和sqlcode,就需要在執行復合語句的第乙個語句把sqlsate和sqlcode賦予本地變數或引數。

通常,我們會為db2 儲存過程定義乙個執行狀態的輸出引數(例如:pogenstatus)。

declare sqlcode integer default 0;  

begin declare continue handler for sqlexception set ret = sqlcode;

declare continue handler for sqlwarning set ret = sqlcode;

declare continue handler for not found set ret = sqlcode; end ;

異常的宣告

異常的處理

if sqlcode< 0 or sqlcode= 100 then   

set o_retcod = retcode;

set o_retmsg = 'cln02:

產品例項關聯客戶過程出錯!';

insert into log.oper_log_tab

(proc_name,obj_tab,region_cod,oper_count

,err_code,data_time,oper_time)

values('p_dw_clean','global temp',0,0,retcode,

char(last_3_mon_time),current timestamp);

return; else set retcode = 0; end if;

較好的例項:

create procedure divide ( in numerator integer,  

in denominator integer, out result integer)

language sql begin declare overflow

condition for sqlstate '22003';

declare continue handler for overflow

resignal sqlstate '22375';

if denominator = 0 then signal overflow;

else set result = numerator / denominator; end if;

附另外一篇:

2、異常捕捉 

declare exit | continue | undo 

handler for 異常 | sqlstate

-- 獲取sqlcode,selstate,sqlerrm資訊到變數中 

end; 

注:exit;只跳轉出handler定義所在的begin 和 end的程式塊 

3、異常丟擲 

signal 拋出自定義異常或者是已經定義的異常

signal sqlstate [set message_text = ]; 丟擲異常,制定異常的sqlstate和異常資訊

resignal  用在異常控制代碼捕捉中,指把此異常拋到上一層。

resignal 和 signal 之間的區別在於,signal是在非handler處理邏輯中丟擲異常,而resignal則是在handler處理邏輯中丟擲異常。語法一致。 

4、注:procedure中能夠定義和捕捉異常,function中不支援異常處理。 

db2儲存過程批量插入資料 db2儲存過程批量更新

db2儲存過程批量更新 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等公共...

db2儲存過程批量插入資料 db2儲存過程批量提交

db2儲存過程批量提交 雲伺服器 elastic compute service,簡稱ecs 是阿里雲提供的效能卓越 穩定可靠 彈性擴充套件的iaas infrastructure as a service 級別雲計算服務。雲伺服器ecs免去了您採購it硬體的前期準備,讓您像使用水 電 天然氣等公共...

DB2儲存過程雜談

db2常用的異常處理方式分為三種 undo 回滾 exit 退出 continue 繼續執行 declare undo exit continue handler for 異常處理的物件可以為針對指定的sqlstate declare undo exit continue handler for s...