首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 儲存過程異常處理機制完整指南:DECLARE HANDLER、條件命名、CONTINUE/EXIT/UNDO 行為詳解

     編輯:MySQL 資料庫相關知識

MySQL 儲存過程透過 DECLARE ... HANDLER 實現結構化異常處理,支援錯誤碼、SQLSTATE、命名條件、警告/未找到/異常三大類別,以及 CONTINUE/EXIT/UNDO 三種動作。本文系統解析語法、語義與實戰模式。

一、語法骨架

DECLARE handler_action HANDLER
FOR condition_value [, condition_value] ...
statement

handler_action: CONTINUE | EXIT | UNDO
condition_value:
  mysql_error_code
| SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION

二、六種條件值分類

類別condition_value說明範例
精確匹配mysql_error_codeMySQL 專屬錯誤碼1062 (Duplicate entry)
SQLSTATE [VALUE] sqlstate_valueANSI/ODBC 標準 5 碼'23000' (完整性約束違規)
condition_name自定義命名條件DECLARE dup_key CONDITION FOR 1062
類別匹配SQLWARNINGSQLSTATE 以 '01' 開頭警告,如截斷
NOT FOUNDSQLSTATE 以 '02' 開頭游標無資料
SQLEXCEPTIONSQLSTATE 非 '00'/'01'/'02'真正錯誤

三、預設行為(無 HANDLER 時)

  • SQLWARNING、NOT FOUND:**忽略繼續執行**(CONTINUE)
  • SQLEXCEPTION:**立即終止過程**(EXIT)

四、三種處理動作

  • CONTINUE:執行 statement 後,**繼續**下一條指令
  • EXIT:執行 statement 後,**離開**當前 BEGIN...END 區塊
  • UNDO:執行 statement 後,**回滾**事務(**暫不支援**)

五、命名條件:提升可讀性

DECLARE foreign_key_error CONDITION FOR 1216;
-- 或標準 SQLSTATE
DECLARE foreign_key_error CONDITION FOR SQLSTATE '23000';

DECLARE CONTINUE HANDLER FOR foreign_key_error
  SET @err_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 in_zipcode VARCHAR(10),
  OUT out_status VARCHAR(30)
)
BEGIN
  DECLARE CONTINUE HANDLER FOR 1062  -- ER_DUP_ENTRY
    SET out_status = 'Duplicate Entry';

  SET out_status = 'OK';
  INSERT INTO locations (location, address1, address2, zipcode)
  VALUES (in_location, in_address1, in_address2, in_zipcode);
END;

七、游標 NOT FOUND 標準模式

DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT id FROM t;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;
read_loop: LOOP
  FETCH cur INTO v_id;
  IF done THEN LEAVE read_loop; END IF;
  -- 處理 v_id
END LOOP;
CLOSE cur;

八、最佳實踐清單

  1. **精確匹配優先**:具體錯誤碼/狀態碼處理具體業務邏輯
  2. **類別匹配兜底**:SQLEXCEPTION 記錄錯誤上下文、NOT FOUND 控制游標循環
  3. **命名條件**:錯誤碼語義化,團隊共享條件字典
  4. **動作選擇**:業務可繼續用 CONTINUE,不可繼續用 EXIT
  5. **避免裸露 SQLWARNING**:除非明確需忽略截斷等警告

結構化異常處理,讓儲存過程具備生產級健壯性。

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