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

MySQL 5 異常處理機制:DECLARE HANDLER 完整教學

     編輯:MySQL 資料庫相關知識

情境:外鍵違規錯誤記錄

當 INSERT 因外鍵約束失敗時,我們希望自動記錄錯誤資訊(時間、原因、值)而非拋出例外中斷流程。

建立測試環境

-- 主鍵表
CREATE TABLE t2 (
    s1 INT, 
    PRIMARY KEY (s1)
) ENGINE=InnoDB;

-- 外鍵表
CREATE TABLE t3 (
    s1 INT, 
    KEY (s1),
    FOREIGN KEY (s1) REFERENCES t2(s1)
) ENGINE=InnoDB;

-- 測試插入不存在的外鍵值
INSERT INTO t3 VALUES (5);
-- ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails

建立錯誤記錄表

CREATE TABLE error_log (
    error_message CHAR(80)
);

核心:建立帶異常處理的存儲過程

CREATE PROCEDURE p22 (parameter1 INT)
BEGIN
    DECLARE EXIT HANDLER FOR 1216
    INSERT INTO error_log VALUES (
        CONCAT('Time: ', CURRENT_DATE, 
               '. Foreign Key Reference Failure For Value = ', parameter1)
    );
    
    INSERT INTO t3 VALUES (parameter1);
END;

關鍵語法解析

  • DECLARE EXIT HANDLER FOR 1216:宣告針對錯誤代碼 1216 的退出處理器
  • 發生錯誤時,執行 INSERT INTO error_log ... 記錄錯誤
  • EXIT 表示處理完成後退出當前 BEGIN...END 複合語句,不再執行後續主邏輯

實際呼叫測試

CALL p22(5);

結果:

  • 主邏輯 INSERT INTO t3 失敗(因 5 不在 t2 中)
  • 無錯誤訊息回傳給客戶端(已被處理器攔截)
  • t3 無新增資料
  • error_log 記錄一筆:「Time: 2024-01-15. Foreign Key Reference Failure For Value = 5」

DECLARE HANDLER 完整語法

DECLARE 
{ EXIT | CONTINUE } 
HANDLER FOR 
{ error-number | SQLSTATE error-string | condition } 
SQL statement

兩種處理器模式差異

CONTINUE 範例:主鍵衝突計數

CREATE TABLE t4 (s1 INT, PRIMARY KEY(s1));

CREATE PROCEDURE p23()
BEGIN
    DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;
    
    SET @x = 1;
    INSERT INTO t4 VALUES (1);  -- 成功
    SET @x = 2;
    INSERT INTO t4 VALUES (1);  -- 主鍵衝突,觸發 HANDLER,@x2=1,但繼續執行
    SET @x = 3;
END;

執行後 @x=3、@x2=1,證明 CONTINUE 讓流程未中斷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式行為
EXIT處理完畢後退出當前複合語句(類似 try-catch 後跳出)
CONTINUE處理完畢後繼續執行複合語句後續陳述式