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 thenset 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...