條件宣告
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 記錄錯誤日誌並回滾交易。