| 類型 | 說明 | 範例 |
| mysql_error_code | MySQL 數字錯誤碼 | 1062 (Duplicate entry) |
| SQLSTATE [VALUE] sqlstate_value | 標準 5 碼狀態碼 | '23000' (Integrity constraint) |
| condition_name | 自訂條件名稱 | foreign_key_error |
| SQLWARNING | SQLSTATE 以 '01' 開頭 | 警告類 |
| NOT FOUND | SQLSTATE 以 '02' 開頭 | 游標無資料 |
| SQLEXCEPTION | SQLSTATE 非 '00'/'01'/'02' | 一般錯誤 |
自訂條件名稱
提升可讀性:
DECLARE foreign_key_error CONDITION FOR 1062;
DECLARE CONTINUE HANDLER FOR foreign_key_error
SET @msg = 'Foreign key violation';
實戰範例:處理重複鍵錯誤
CREATE PROCEDURE sp_add_location (
IN in_location VARCHAR(30),
IN in_address1 VARCHAR(30),
IN in_address2 VARCHAR(30),
IN zipcode VARCHAR(10),
OUT out_status VARCHAR(30)
)
BEGIN
DECLARE CONTINUE HANDLER FOR 1062
SET out_status = 'Duplicate Entry';
SET out_status = 'OK';
INSERT INTO locations (location, address1, address2, zipcode)
VALUES (in_location, in_address1, in_address2, zipcode);
END;
預設行為補充
- 無 HANDLER 時:SQLWARNING/NOT FOUND → 忽略繼續;SQLEXCEPTION → 立即終止。
- 一個 HANDLER 可對應多個 condition_value,以逗號分隔。
- statement 可為單行或
BEGIN ... END 區塊。
最佳實踐建議
- 優先使用
SQLSTATE 而非錯誤碼,跨版本相容性較佳。
- 為常見業務錯誤定義
condition_name,程式碼自文檔化。
- 謹慎使用
EXIT,確保資源釋放(關閉游標、釋放鎖)。
- 記錄錯誤上下文(時間、參數、堆疊)便於事後排查。

- 上一篇文章: MySQL 游標輸出資料實戰範例:逐行擷取員工 ID 列表
- 下一篇文章: Windows 免安裝部署 MySQL 5.7 完整實戰記錄:初始化、註冊服務、Root 密碼重置
Copyright ©
程式碼之家 All Rights Reserved