在 DB2 SQL PL(SQL Procedural Language)中,異常處理器由 DECLARE ... HANDLER FOR ... 定義,其 handler-type 決定錯誤發生後的程式流向:
| 類型 | 執行時機 | 後續流程 | 適用場景 |
|---|---|---|---|
| CONTINUE | 處理器動作完成後 | 繼續執行發生錯誤的語句下一條語句 | 可預期、可忽略的錯誤(如嘗試刪除不存在的行) |
| EXIT | 處理器動作完成後 | 立即終止存儲過程,控制權返回呼叫者 | 嚴重錯誤,無法繼續,需記錄日誌後退出 |
| UNDO | 處理器動作執行前 | 先回滾存儲過程中已執行的 SQL 操作,再終止並返回呼叫者 | 需保證原子性的業務邏輯,錯誤時撤銷所有變更 |
除了針對特定 SQLSTATE 定義處理器,DB2 提供三組預定義條件類別:
SQLCODE = +100 或 SQLSTATE = '02000'SELECT ... INTO 無資料、游標 FETCH 超出結果集SQLCODE < 0(負值錯誤碼)SQLCODE > 0 且 != +100(警告類正值碼)CONTINUE)。EXIT 但無自定義清理動作)。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 SQLEXCEPTIONEXIT HANDLER FOR SQLEXCEPTIONCONTINUE HANDLER FOR SQLSTATE '23505'(如唯一鍵重複)