首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 儲存過程 BEGIN END 複合語句語法與標籤用法詳解

     編輯:MySQL 資料庫相關知識

BEGIN ... END 是 MySQL 儲存程序、函數、觸發器中定義複合語句塊的核心結構。本文詳細講解語法結構、語句列表規則、標籤機制、原子性限制與定界符處理實戰技巧。

一、 語法結構

[begin_label:] BEGIN
    [statement_list]
END [end_label]
  • statement_list:一條或多條 SQL 語句,**每條必須以分號 ; 結尾**。
  • 可巢狀嵌套多層 BEGIN ... END 塊。

二、 標籤機制

  • begin_label:選填,用於標識塊起始位置。
  • end_label:選填,**只有當 begin_label 存在時才能指定**,且兩者名稱**必須完全一致**。
  • 用途: 配合 LEAVE label、ITERATE label 實現流程控制(跳出/繼續指定層級循環)。
outer_block: BEGIN
    inner_block: BEGIN
        IF condition THEN
            LEAVE outer_block;  -- 直接跳出外層塊
        END IF;
    END inner_block;
END outer_block;

三、 原子性子句限制

語法允許可選的 [NOT] ATOMIC 子句,但 **MySQL 目前不支援** 。意味著:

  • 塊開始時**不會**隱式設置保存點。
  • BEGIN 對當前事務**無影響**(不啟動新事務、不提交/回滾)。
  • 事務控制需顯式使用 START TRANSACTION、COMMIT、ROLLBACK。

四、 定界符處理實戰(關鍵避坑)

預設客戶端以分號 ; 為語句結束符。在儲存程序體內包含分號時,需臨時修改定界符:

DELIMITER //

CREATE PROCEDURE demo_proc()
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < 10 DO
        INSERT INTO t VALUES (i);
        SET i = i + 1;
    END WHILE;
END //

DELIMITER ;
  • DELIMITER // 將結束符改為 //,使程序體內的 ; 不被提前解析。
  • 定義結束後用 DELIMITER ; 恢復預設。
  • 適用於 mysql 命令列客戶端、MySQL Workbench、大多數 GUI 工具。

五、 完整範例:帶標籤的錯誤處理塊

CREATE PROCEDURE process_order(IN order_id INT)
main_block: BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SELECT 'Error occurred, rolled back';
    END;

    START TRANSACTION;
    
    update_block: BEGIN
        UPDATE orders SET status='processing' WHERE id=order_id;
        UPDATE inventory SET qty=qty-1 WHERE product_id=(SELECT product_id FROM orders WHERE id=order_id);
    END update_block;

    COMMIT;
    SELECT 'Order processed successfully';
END main_block;

六、 總結

  • BEGIN ... END 定義語句塊,支援巢狀與標籤。
  • 標籤需成對一致,配合 LEAVE/ITERATE 控制流程。
  • 無隱式原子性,事務需顯式控制。
  • 定義儲存程序時務必修改定界符,避免分號衝突導致語法錯誤。

掌握以上核心點,即可編寫結構清晰、流程可控的 MySQL 儲存程序邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved