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

MySQL 存儲過程 BEGIN...END 復合語句完整指南:語法、標籤、定界符與實戰技巧

     編輯:MySQL 綜合教學

語法結構

[begin_label:] BEGIN
    [statement_list]
END [end_label]
  • statement_list:一條或多條 SQL 語句,**每條必須以分號 `;` 結尾**。
  • 標籤規則:
    • 可選的 `begin_label` 和 `end_label` 必須成對出現且名稱相同。
    • 僅有 `end_label` 而無 `begin_label` 會報錯。
    • 用於 `LEAVE`、`ITERATE` 流程控制跳轉。
  • 不支持 `[NOT] ATOMIC` 子句(標準 SQL 特性),即無隱式保存點,BEGIN 不影響當前事務。
  • 定界符修改:關鍵步驟

    默認分號 `;` 是語句結束符,存儲過程體內部也需要分號,必須臨時修改定界符:

    DELIMITER //
    
    CREATE PROCEDURE demo_proc()
    BEGIN
        DECLARE v INT DEFAULT 0;
        WHILE v < 5 DO
            INSERT INTO test_log(msg) VALUES (CONCAT('Loop ', v));
            SET v = v + 1;
        END WHILE;
    END //
    
    DELIMITER ;
    

    工具提示: Navicat、DBeaver、MySQL Workbench 等 GUI 工具通常自動處理定界符,無需手動輸入 `DELIMITER`。

    標籤與流程控制實例

    CREATE PROCEDURE label_demo()
    main_block: BEGIN
        DECLARE i INT DEFAULT 0;
        loop_label: LOOP
            SET i = i + 1;
            IF i = 3 THEN
                ITERATE loop_label; -- 跳過本次循環剩餘部分
            END IF;
            INSERT INTO test_log(msg) VALUES (CONCAT('i = ', i));
            IF i >= 5 THEN
                LEAVE main_block; -- 直接跳出外層 BEGIN...END
            END IF;
        END LOOP loop_label;
        INSERT INTO test_log(msg) VALUES ('After loop');
    END
    

    最佳實踐建議

    1. 保持簡單: 複雜業務邏輯優先放應用層,存儲過程僅做數據密集型操作。
    2. 事務邊界清晰: 存儲過程不自動開啟事務,調用者控制 `START TRANSACTION` / `COMMIT`。
    3. 避免深度嵌套: 超過 3 層 BEGIN...END 維護極難,拆分為多個過程。
    4. 版本控制: 存儲過程代碼納入 Git 管理,通過遷移腳本部署。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved