萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 預存程序條件宣告與錯誤處理(DECLARE CONDITION / HANDLER)

條件宣告

DECLARE condition_name CONDITION FOR condition_value;
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | MYSQL_ERROR_CODE

處理器宣告

DECLARE handler_type HANDLER FOR condition_value [...] statement;
handler_type:
    CONTINUE | EXIT | UNDO
condition_value:
    SQLSTATE [VALUE] sqlstate_value
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION
  | MYSQL_ERROR_CODE

實戰範例:捕捉主鍵重複錯誤

DELIMITER $$
CREATE PROCEDURE actor_insert()
BEGIN
    DECLARE CONTINUE HANDLER FOR 1062 -- ER_DUP_ENTRY
    BEGIN
        SET @x = 999; -- 標記錯誤
    END;

    SET @x = 1;
    INSERT INTO actor(id) VALUES (201); -- 成功
    SET @x = 2;
    INSERT INTO actor(id) VALUES (202); -- 假設 202 已存在,觸發 1062
    SET @x = 3;
END $$
DELIMITER ;

CALL actor_insert();
SELECT @x; -- 返回 999,表示進入了錯誤處理器,後續 INSERT 未執行

關鍵點

  • CONTINUE:執行完 handler 繼續後續陳述式;EXIT:離開當前 BEGIN...END 區塊。
  • 可針對特定 SQLSTATE(如 '23000' 完整性約束違反)或 MySQL 錯誤碼(1062 重複鍵)定義 handler。
  • 建議在生產環境預存程序中統一加入 SQLEXCEPTION handler 記錄錯誤日誌並回滾交易。
copyright © 萬盛學電腦網 all rights reserved