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

MySQL 預存程序異常處理全解析:DECLARE HANDLER 實戰範例

     編輯:MySQL 資料庫相關知識

MySQL 預存程序錯誤處理機制:HANDLER 語法與實戰

MySQL 透過 DECLARE ... HANDLER 在預存程序中處理錯誤與警告。

標準語法

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

handler_type: CONTINUE | EXIT | UNDO (暫不支援)

condition_value:
  SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING      -- 01 開頭錯誤代碼
  | NOT FOUND       -- 02 開頭 / 游標結束
  | SQLEXCEPTION    -- 除上述外所有錯誤
  | MySQL_error_code

錯誤代碼查詢

完整列表見安裝目錄 share/mysql/errmsg.txt。非所有 MySQL 錯誤碼皆映射至 SQLSTATE。

實戰範例 1:EXIT HANDLER (遇錯誤退出)

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

DELIMITER //
CREATE PROCEDURE handlerdemo()
BEGIN
  DECLARE EXIT HANDLER FOR SQLSTATE '23000' BEGIN END; -- 重複鍵退出
  SET @x = 1;
  INSERT INTO t VALUES (1);
  SET @x = 2;
  INSERT INTO t VALUES (1); -- 這裡報錯,退出
  SET @x = 3;
END//
DELIMITER ;

CALL handlerdemo(); SELECT @x; -- 結果 @x=2 (停在第二次 INSERT 前)

實戰範例 2:CONTINUE HANDLER (遇錯誤繼續)

CREATE PROCEDURE handlerdemo()
BEGIN
  DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' BEGIN END;
  SET @x = 1;
  INSERT INTO t VALUES (1);
  SET @x = 2;
  INSERT INTO t VALUES (1); -- 錯誤但繼續
  SET @x = 3;
END;

CALL handlerdemo(); SELECT @x; -- 結果 @x=3 (執行完畢)

SQLSTATE '23000' 可替換為 MySQL 錯誤碼 1062 (Duplicate entry)。

實戰範例 3:處理警告 (SQLWARNING) 與具體錯誤碼 (1364)

ALTER TABLE t ADD s2 INT NOT NULL; -- 無預設值,INSERT 會警告/錯誤 1364

CREATE PROCEDURE handlerdemo()
BEGIN
  DECLARE CONTINUE HANDLER FOR 1062 BEGIN END;           -- 重複鍵忽略
  DECLARE CONTINUE HANDLER FOR SQLWARNING               -- 警告處理
    BEGIN UPDATE t SET s2 = 2; END;
  DECLARE CONTINUE HANDLER FOR 1364                     -- 欄位無預設值錯誤
    BEGIN INSERT INTO t(s1,s2) VALUES (1,3); END;

  SET @x = 1;
  INSERT INTO t(s1) VALUES (1);  -- 觸發 1364,插入 (1,3)
  SET @x = 2;
  INSERT INTO t(s1) VALUES (1);  -- 觸發 1062,忽略
  SET @x = 3;
END;

CALL handlerdemo();
SELECT * FROM t; -- 結果: (1,3) 只有一行
SELECT @x;       -- @x=3

關鍵差異

Handler Type行為
EXIT發生條件時離開當前 BEGIN...END 區塊
CONTINUE發生條件時繼續執行下一條語句

善用 HANDLER 可建立健壯的預存程序,避免單一錯誤導致整個流程中斷。

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