BEGIN ... END 是 MySQL 儲存程序、函數、觸發器中定義複合語句塊的核心結構。本文詳細講解語法結構、語句列表規則、標籤機制、原子性限制與定界符處理實戰技巧。
[begin_label:] BEGIN
[statement_list]
END [end_label]
statement_list:一條或多條 SQL 語句,**每條必須以分號 ; 結尾**。BEGIN ... END 塊。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 儲存程序邏輯。