首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 預存程序異常處理全攻略:Handler 類型、條件捕捉與最佳實務

     編輯:DB2 教學

預存程序異常處理架構

DB2 預存程序透過 DECLARE ... HANDLER 機制處理運行時異常,語法結構如下:

DECLARE handler-type HANDLER FOR condition handler-action

核心在於三種 Handler Type,決定異常發生後的控制流走向:

1. CONTINUE —— 繼續執行

執行完 handler-action 後,程式繼續執行「發生異常的下一條語句」。適用於可預期、可忽略的警告或 NOT FOUND 情境。

2. EXIT —— 直接退出

執行完 handler-action 後,立即終止預存程序,控制權返回呼叫端。適用於嚴重錯誤,需快速失敗並回報。

3. UNDO —— 回滾並退出

在執行 handler-action 之前,先回滾預存程序內已執行的所有 SQL 操作;隨後終止程序並返回呼叫端。適用於需維護交易一致性的關鍵業務邏輯。

預定義異常條件類別

DB2 內建三大預定義條件群,涵蓋最常見的異常場景:

條件名稱 對應 SQLCODE / SQLSTATE 典型觸發情境
NOT FOUND SQLCODE +100 / SQLSTATE 02000 SELECT 無資料回傳、游標到達末尾
SQLEXCEPTION SQLCODE < 0 所有執行階段錯誤(語法、約束違反、權限不足等)
SQLWARNING SQLCODE > 0 且 ≠ +100 隱式轉型截斷、權限授予已存在等警告

若未為 NOT FOUND 或 SQLWARNING 定義 Handler,DB2 會自動忽略並繼續;若未處理 SQLEXCEPTION,程序直接失敗並返回呼叫端。

自訂條件與進階範例

當預定義條件不足時,可針對特定 SQLSTATE 宣告自訂條件名稱:

DECLARE unique-name CONDITION FOR SQLSTATE 'sqlstate-value';

實務範例:除零錯誤自訂處理

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;
END

企業級錯誤記錄範本

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(...)
  VALUES ('P_DW_CLEAN', 'GLOBAL TEMP', 0, 0, retcode, ...);
  RETURN;
ELSE
  SET RetCode = 0;
END IF;

關鍵注意事項

  • SQLCODE/SQLSTATE 會在複合語句執行時改變,若需保留原始值,請在 BEGIN ... END 區塊第一行即存入區域變數。
  • 建議為每個預存程序定義 輸出參數(如 poGenStatus) 統一回傳執行狀態,便於上層應用統一錯誤處理。
  • Handler 可針對單一語句或 BEGIN ... END 區塊定義,範圍視業務需求而定。

善用三種 Handler Type、預定義與自訂條件,配合結構化錯誤記錄,即可建立健壯、可維護的 DB2 預存程序異常處理體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved