DECLARE {CONTINUE | EXIT} HANDLER
FOR {SQLSTATE sqlstate_code | MySQL_error_code | condition_name}
handler_statement;
CONTINUE:執行 handler_statement 後**繼續**當前 BEGIN...END 區塊EXIT:執行 handler_statement 後**退出**當前 BEGIN...END 區塊1062 Duplicate Key)'23000' Integrity Constraint Violation)SQLEXCEPTION (所有錯誤)、SQLWARNING (警告)、NOT FOUND (游標無數據)BEGIN ... END 包裹多條)DECLARE CONTINUE HANDLER FOR 1062 SET @duplicate_key = 1;
-- 等價於
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @duplicate_key = 1;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @l_error = 1;
DECLARE foreign_key_error CONDITION FOR 1216; -- 或 SQLSTATE '23000'
DECLARE CONTINUE HANDLER FOR foreign_key_error
BEGIN
INSERT INTO error_log (msg) VALUES ('Foreign key violation');
SET @fk_error = 1;
END;
MySQL 錯誤碼 > SQLSTATE > 命名條件 (SQLEXCEPTION/SQLWARNING/NOT FOUND)
定義順序不影響優先級,具體碼永遠優先於通用類別。
BEGIN ... END 區塊內的語句BEGIN ... END 定義的 HANDLER **不保護** 外層同級語句-- 1. 區塊級生效
DECLARE CONTINUE HANDLER FOR 1048 SELECT 'Null insert attempted';
BEGIN
INSERT INTO a VALUES (6, NULL); -- 觸發 1048,被捕獲
END;
-- 2. 內層定義不保護外層
BEGIN
BEGIN
DECLARE CONTINUE HANDLER FOR 1216 SELECT 'FK violated';
END;
INSERT INTO departments ...; -- 此處 1216 **不會** 被捕獲!
END;
| MySQL 錯誤碼 | SQLSTATE | 含義 |
|---|---|---|
| 1022 | 23000 | Duplicate key |
| 1048 | 23000 | Column cannot be null |
| 1062 | 23000 | Duplicate entry |
| 1114 | HY000 | Table is full |
| 1205 | HY000 | Lock wait timeout |
| 1216 | 23000 | Foreign key constraint fails (child) |
| 1217 | 23000 | Foreign key constraint fails (parent) |
| 1242 | 21000 | Subquery returns > 1 row |
| 1317 | 70100 | Query execution interrupted |
| 1329 | 02000 | No data to FETCH |
EXIT 只退出當前區塊,外層邏輯繼續執行