首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 儲存程序例外處理區塊使用多重語句:BEGIN...END 區塊實戰教學

     編輯:MySQL 綜合教學

核心語法

在 DECLARE HANDLER 中執行多條語句,需用 BEGIN ... END 包裹:


DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' BEGIN
    SET @done = 1;
    SET @done2 = 222;
    INSERT INTO t VALUES (1);  -- 可執行任意語句
END;

完整測試案例

1. 建立測試表(空表)


DROP TABLE IF EXISTS t;
CREATE TABLE t(id INT);

2. 建立儲存程序


DROP PROCEDURE IF EXISTS test;
DELIMITER |
CREATE PROCEDURE test()
BEGIN
    DECLARE vId INT;
    -- 游標查詢空結果集
    DECLARE cTest CURSOR FOR SELECT * FROM t;
    -- 異常處理:NOT FOUND (02000) 時執行多句
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' BEGIN
        SET @done = 1;
        SET @done2 = 222;
        INSERT INTO t VALUES (1);
    END;
    
    OPEN cTest;
    FETCH NEXT FROM cTest INTO vId;  -- 觸發 NOT FOUND
    SET @done2 = 333;
    CLOSE cTest;
END;
|
DELIMITER ;

3. 執行與驗證


CALL test();
SELECT @done2 FROM dual;  -- 333 (主程序繼續執行到此行)
SELECT * FROM t;          -- 1 (HANDLER 中的 INSERT 生效)

關鍵觀察點

  1. CONTINUE HANDLER:執行區塊後回到主程序繼續(@done2 從 222 變 333)
  2. 若用 EXIT HANDLER:執行區塊後離開程序,@done2 將保持 222
  3. 區塊內可執行任意合法語句:變數指派、DML、DDL、流程控制等
  4. 游標 FETCH 空結果集 → 觸發 SQLSTATE '02000' (NOT FOUND)

對比:EXIT vs CONTINUE 多語句區塊

HANDLER 類型執行區塊後@done2 最終值適用場景
CONTINUE ... BEGIN ... END回主程序下一行333記錄日誌、計數、清理後繼續
EXIT ... BEGIN ... END離開當前 BEGIN...END222嚴重錯誤、需中止、回滾交易

實務應用範例:游標迴圈中的例外處理


CREATE PROCEDURE process_data()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE v_id INT;
    DECLARE cur CURSOR FOR SELECT id FROM source_table;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO v_id;
        IF done THEN LEAVE read_loop; END IF;
        
        -- 處理邏輯可能拋出例外
        BEGIN
            DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN
                INSERT INTO error_log (err_id, err_msg) VALUES (v_id, 'Processing failed');
                -- 記錄後繼續處理下一筆
            END;
            
            CALL risky_operation(v_id);
        END;
    END LOOP;
    CLOSE cur;
END;

宣告順序規則(必須遵守)

  1. 變數宣告(DECLARE var ...)
  2. 條件宣告(DECLARE condition ...)
  3. 游標宣告(DECLARE cursor ...)
  4. 處理器宣告(DECLARE HANDLER ...)
  5. 執行語句
違反順序會導致語法錯誤:「ERROR 1337 (HY000): Variable or condition declaration after cursor or handler declaration」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved