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

DB2 存儲過程異常處理器類型全解析:CONTINUE、EXIT、UNDO 與條件分類

     編輯:DB2 教學

三大處理器行為類型

在 DB2 SQL PL(SQL Procedural Language)中,異常處理器由 DECLARE ... HANDLER FOR ... 定義,其 handler-type 決定錯誤發生後的程式流向:

類型執行時機後續流程適用場景
CONTINUE 處理器動作完成後 繼續執行發生錯誤的語句下一條語句 可預期、可忽略的錯誤(如嘗試刪除不存在的行)
EXIT 處理器動作完成後 立即終止存儲過程,控制權返回呼叫者 嚴重錯誤,無法繼續,需記錄日誌後退出
UNDO 處理器動作執行前 先回滾存儲過程中已執行的 SQL 操作,再終止並返回呼叫者 需保證原子性的業務邏輯,錯誤時撤銷所有變更

三類預定義異常條件

除了針對特定 SQLSTATE 定義處理器,DB2 提供三組預定義條件類別:

1. NOT FOUND

  • 對應 SQLCODE = +100 或 SQLSTATE = '02000'
  • 典型場景:SELECT ... INTO 無資料、游標 FETCH 超出結果集

2. SQLEXCEPTION

  • 對應 SQLCODE < 0(負值錯誤碼)
  • 涵蓋所有執行時錯誤:語法錯誤、約束違反、死鎖、權限不足等

3. SQLWARNING

  • 對應 SQLCODE > 0 且 != +100(警告類正值碼)
  • 如:資料截斷、空值消除警告、非最優存取路徑等

無處理器時的預設行為

  • NOT FOUND / SQLWARNING:忽略異常,繼續執行下一句(等同 CONTINUE)。
  • SQLEXCEPTION:存儲過程立即失敗,控制權返回呼叫者(等同 EXIT 但無自定義清理動作)。

實戰範例:結合 UNDO 保證資料一致性

CREATE PROCEDURE transfer_funds(
  IN from_acct INT, IN to_acct INT, IN amt DECIMAL(10,2)
)
LANGUAGE SQL
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    -- 記錄錯誤日誌
    INSERT INTO error_log(proc_name, sqlstate, msg)
    VALUES ('transfer_funds', SQLSTATE, 'Transfer failed');
    -- UNDO 隱含:若改用 UNDO HANDLER,此處無需手動 ROLLBACK
  END;

  UPDATE accounts SET balance = balance - amt WHERE acct_id = from_acct;
  UPDATE accounts SET balance = balance + amt WHERE acct_id = to_acct;
  COMMIT;
END

關鍵選擇建議

  • 需資料完整性回滾 → UNDO HANDLER FOR SQLEXCEPTION
  • 需記錄日誌後優雅退出 → EXIT HANDLER FOR SQLEXCEPTION
  • 預期特定可忽略錯誤 → CONTINUE HANDLER FOR SQLSTATE '23505'(如唯一鍵重複)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved