DB2 存儲(chǔ)過(guò)程的異常處理器類型有幾種?
以下的文章主要向大家講述的是DB2 存儲(chǔ)過(guò)程的異常處理方法,在DB2數(shù)據(jù)庫(kù)中,假如你要使用sqlcode,那么你就必須在DDL語(yǔ)句之前declare。這是我們大家都必須了解的,以下就是文章的主要內(nèi)容描述。
存儲(chǔ)過(guò)程異常的處理:
- DECLARE handler-type HANDLER FOR condition handler-action
異常處理器類型(handler-type)有以下幾種:
CONTINUE 在處理器操作完成之后,會(huì)繼續(xù)執(zhí)行產(chǎn)生這個(gè)異常語(yǔ)句之后的下一條語(yǔ)句。
EXIT 在處理器操作完成之后,存儲(chǔ)過(guò)程會(huì)終止,并將控制返回給調(diào)用者。
UNDO 在處理器操作執(zhí)行之前,DB2會(huì)回滾存儲(chǔ)過(guò)程中執(zhí)行的SQL操作。在處理器操作完成之后,存儲(chǔ)過(guò)程會(huì)終止,并將控制返回給調(diào)用者。
異常處理器可以處理基于特定SQLSTATE值的定制異常,或者處理預(yù)定義異常的類。預(yù)定義的3種異常如下所示:
NOT FOUND 標(biāo)識(shí)導(dǎo)致SQLCODE值為+100或者SQLSATE值為02000的異常。這個(gè)異常通常在SELECT沒(méi)有返回行的時(shí)候出現(xiàn)。
SQLEXCEPTIOIN 標(biāo)識(shí)導(dǎo)致SQLCODE值為負(fù)的異常。
SQLWARNING 標(biāo)識(shí)導(dǎo)致警告異?;蛘邔?dǎo)致+100以外的SQLCODE正值的異常。
如果產(chǎn)生了NOT FOUND 或者SQLWARNING異常,并且沒(méi)有為這個(gè)異常定義異常處理器,那么就會(huì)忽略這個(gè)異常,并且將控制流轉(zhuǎn)向下一個(gè)語(yǔ)句。如果產(chǎn)生了SQLEXCEPTION異常,并且沒(méi)有為這個(gè)異常定義異常處理器,那么DB2 存儲(chǔ)過(guò)程就會(huì)失敗,并且會(huì)將控制流返回調(diào)用者。
以下示例聲明了兩個(gè)異常處理器。 EXIT處理器會(huì)在出現(xiàn)SQLEXCEPTION 或者SQLWARNING異常的時(shí)候被調(diào)用。EXIT處理器會(huì)在終止SQL程序之前,將名為stmt的變量設(shè)為"ABORTED",并且將控制流返回給調(diào)用者。UNDO處理器會(huì)將控制流返回給調(diào)用者之前,回滾存儲(chǔ)過(guò)程體中已經(jīng)完成的SQL操作。
清單3:異常處理器示例
- DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = 'ABORTED';
- DECLARE UNDO HANDLER FOR NOT FOUND;
如果預(yù)定義異常集不能滿足需求,就可以為特定的SQLSTATE值聲明定制異常,然后再為這個(gè)定制異常聲明處理器。語(yǔ)法如下:
清單4:定制異常處理器
- DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'
處理器可以由單獨(dú)的存儲(chǔ)過(guò)程語(yǔ)句定義,也可以使用由BEGIN…END塊界定的復(fù)合語(yǔ)句定義。注意在執(zhí)行符合語(yǔ)句的時(shí)候,SQLSATE和SQLCODE的值會(huì)被改變,如果需要保留異常前的SQLSATE和SQLCODE,就需要在執(zhí)行復(fù)合語(yǔ)句的***個(gè)語(yǔ)句把SQLSATE和SQLCODE賦予本地變量或參數(shù)。
通常,我們會(huì)為DB2 存儲(chǔ)過(guò)程定義一個(gè)執(zhí)行狀態(tài)的輸出參數(shù)(例如: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:產(chǎn)品實(shí)例關(guān)聯(lián)客戶過(guò)程出錯(cuò)!';
- 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;
較好的實(shí)例:
- 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;
以上的相關(guān)內(nèi)容就是對(duì)DB2 存儲(chǔ)過(guò)程異常處理方法的介紹,望你能有所收獲。
【編輯推薦】