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

MySQL 存儲過程異常處理機制深度解析:DECLARE HANDLER 全攻略

     編輯:MySQL 綜合教學

MySQL 存儲過程異常處理機制深度解析:DECLARE HANDLER 全攻略

存儲過程中發生錯誤時,默認行為是「警告繼續、異常終止」。通過 `DECLARE ... HANDLER` 可精準捕獲特定錯誤並自定義處理邏輯(繼續、退出、回滾)。本文系統講解 Handler 語法、六大條件類型、三種動作模式、命名條件最佳實踐,並給出生產級異常處理模板。

一、 Handler 語法全景

  類型匹配範圍典型場景默認行為
  mysql_error_code具體 MySQL 錯誤號 (如 1062, 1216)捕獲具體業務錯誤(主鍵衝突、外鍵失敗)SQLEXCEPTION → EXIT
  SQLSTATE VALUE標準 5 字符碼 (如 '23000', 'HY000')跨數據庫兼容、標準化錯誤處理同左
  condition_name自定義名稱 (需先 DECLARE CONDITION)語義化、可維護、團隊協作同左
  SQLWARNING所有 01xxx 類警告截斷警告、棄用語法警告CONTINUE (忽略繼續)
  NOT FOUND所有 02xxx 類 (游標無數據、SELECT...INTO 無結果)游標循環終止控制CONTINUE (需手動處理)
  SQLEXCEPTION除 00/01/02 外所有錯誤兜底異常捕獲EXIT (終止過程)


三、 三種動作模式語義

  • CONTINUE:執行 handler statement 後,**繼續執行下一條語句**(當前 BEGIN...END 塊)。
  • EXIT:執行 handler statement 後,**退出當前 BEGIN...END 塊**(若是最外層則結束過程)。
  • UNDO:語法保留,**暫不支持**,意圖為回滾當前事務。

四、 命名條件:讓錯誤處理可讀、可維護

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
  -- 1. 定義重複鍵處理器(捕獲 1062,設置狀態,繼續執行)
  DECLARE CONTINUE HANDLER FOR 1062 
    SET out_status = 'Duplicate Entry';

  -- 2. 默認狀態
  SET out_status = 'OK';

  -- 3. 執行插入(若重複,Handler 捕獲,out_status 被修改,過程繼續結束)
  INSERT INTO `locations` (`location`, `address1`, `address2`, `zipcode`)
  VALUES (in_location, in_address1, in_address2, in_zipcode);
END;

六、 游標循環中的 NOT FOUND 處理模式

  錯誤類別默認 Handler 行為開發者責任
  SQLWARNING (01xxx)CONTINUE (忽略)關鍵警告需顯式捕獲處理
  NOT FOUND (02xxx)CONTINUE (忽略)游標/SELECT INTO 必須自行聲明 Handler 終止循環
  SQLEXCEPTION (其他)EXIT (終止過程)業務異常需顯式捕獲、記錄、回滾、拋出


八、 生產級異常處理模板(建議封裝為代碼片段)

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