在多方協同開發中,預存程序若缺乏統一錯誤處理標準,極易導致應用層無法精準判斷執行狀態,造成聯調困難、問題定位耗時。本文詳細說明如何在 SQL 預存程序中建立健全的錯誤處理機制,確保返回碼語義清晰、異常流程可控。
NOT FOUND、SQLEXCEPTION 等情境,精細控制流程走向。CREATE PROCEDURE OUT_LANGUAGE (
...,
OUT returnCode INTEGER,
OUT returnMsg CHAR(32)
)
SPECIFIC SQL_OUT_LANGUAGE
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE errorLabel CHAR(32) DEFAULT '';
-- 1. 忽略 NOT FOUND,繼續執行
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET returnCode = SQLCODE; -- 或 SET returnCode = 0; 視業務需求
END;
-- 2. 遇到 SQL 異常,立即跳出並記錄錯誤
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET returnCode = SQLCODE;
SET returnMsg = errorLabel;
END;
-- 業務邏輯區塊
......
-- 3. 進階:條件性忽略特定錯誤碼(如 -454 物件已存在/唯一鍵衝突)
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
IF (SQLCODE = -454) THEN
SET returnCode = 0; -- 視為成功繼續
ELSE
SET returnCode = SQLCODE;
SET returnMsg = errorLabel;
END IF;
END;
-- 後續流程依 returnCode 判斷
IF (returnCode = 0) THEN ...... END IF;
IF (returnCode = 0) THEN ...... END IF;
END
| Handler 類型 | 適用場景 | 行為 |
|---|---|---|
| CONTINUE FOR NOT FOUND | 查無資料屬正常業務 | 設定 returnCode 後繼續往下執行 |
| EXIT FOR SQLEXCEPTION | 不可預期的嚴重錯誤 | 記錄錯誤碼與訊息,直接離開程序 |
| CONTINUE FOR SQLEXCEPTION + 判斷 SQLCODE | 已知可忽略的特定錯誤(如 -454) | 針對特定碼歸零,其餘拋出 |
errorLabel 應在關鍵操作前賦值(如 'INSERT_USERS'),異常時可知發生位置。標準化的錯誤處理不僅能讓應用層「看得懂」執行結果,更能在故障發生時縮短 80% 以上的定位時間。請將此範本納入專案開發規範,從源頭杜絕「狀態不明」的聯調惡夢。