程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 存儲過程的異常處理器類型有幾種?

DB2 存儲過程的異常處理器類型有幾種?

編輯:DB2教程

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

存儲過程異常的處理:

  1. 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:異常處理器示例

  1. DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt = 'ABORTED';   
  2. DECLARE UNDO HANDLER FOR NOT FOUND;  

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

清單4:定制異常處理器

  1. DECLARE unique-name CONDITION FOR SQLSATE 'sqlstate'  

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

通常,我們會為DB2 存儲過程定義一個執行狀態的輸出參數(例如:poGenStatus)。

  1. declare sqlcode integer default 0;   
  2. begin   
  3. declare continue handler for sqlexception set ret = sqlcode;   
  4. declare continue handler for sqlwarning set ret = sqlcode;   
  5. declare continue handler for not found set ret = sqlcode;   
  6. end ;  

異常的聲明

異常的處理

  1. if sqlcode< 0 or sqlcode= 100 then   
  2. set O_RetCod = RetCode;   
  3. set O_RetMsg = 'CLN02:產品實例關聯客戶過程出錯!';   
  4. insert into LOG.OPER_LOG_TAB(PROC_NAME,OBJ_TAB,REGION_COD,OPER_COUNT,ERR_CODE,DATA_TIME,OPER_TIME)   
  5. values('P_DW_CLEAN','GLOBAL TEMP',0,0,retcode,CHAR(last_3_mon_time),current TIMESTAMP);   
  6. return;   
  7. else   
  8. set RetCode = 0;   
  9. end if;  

較好的實例:

  1. CREATE PROCEDURE divide ( IN numerator INTEGER,  
  2. IN denominator INTEGER,  
  3. OUT result INTEGER)  
  4. LANGUAGE SQL  
  5. BEGIN  
  6. DECLARE overflow CONDITION FOR SQLSTATE '22003';  
  7. DECLARE CONTINUE HANDLER FOR overflow  
  8. RESIGNAL SQLSTATE '22375';  
  9. IF denominator = 0 THEN  
  10. SIGNAL overflow;  
  11. ELSE  
  12. SET result = numerator / denominator;  
  13. END IF;   

以上的相關內容就是對DB2 存儲過程異常處理方法的介紹,望你能有所收獲。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved