以下的文章主要向大家講述的是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;
以上的相關內容就是對DB2 存儲過程異常處理方法的介紹,望你能有所收獲。