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

MySQL 儲存程序循環構造全解析:WHILE、LOOP、REPEAT 與條件跳出最佳實踐

     編輯:MySQL 綜合教學

MySQL 儲存程序循環構造全解析:WHILE、LOOP、REPEAT 與條件跳出最佳實踐

MySQL 提供三種循環語句,各有適用場景。本文通過完整可執行範例,詳細講解語法、標籤跳出機制、變數控制與常見陷阱。

1. WHILE 循環 — 先判斷後執行

DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_test_while`$$
CREATE PROCEDURE `sp_test_while`(
    IN p_number INT,   -- 循環上限
    IN p_startid INT   -- 起始值
)
BEGIN
    DECLARE v_val INT DEFAULT 0;
    SET v_val = p_startid;

    outer_label: BEGIN              -- 定義標籤塊
        WHILE v_val <= p_number DO
            SET v_val = v_val + 1;
            IF v_val = 100 THEN
                LEAVE outer_label;  -- 跳出標籤塊,後續標籤內代碼不再執行
            END IF;
        END WHILE;
        SELECT '我是 while 外,outer_label 內的 SQL';  -- 不會執行
    END outer_label;

    SELECT CONCAT('test', v_val) AS tname;  -- 會執行
END$$
DELIMITER ;

CALL sp_test_while(1000, 0);

關鍵點:

  • LEAVE label 跳出的是 標籤塊,而非僅循環體
  • 標籤可包裹任意複合語句,靈活控制流程

2. LOOP 循環 — 無條件無限循環,靠內部 LEAVE 終止

DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_testloop`$$
CREATE PROCEDURE `sp_testloop`(
    IN p_number INT,
    IN p_startid INT
)
BEGIN
    DECLARE v_val INT DEFAULT 0;
    SET v_val = p_startid;

    loop_label: LOOP
        SET v_val = v_val + 1;
        IF v_val > p_number THEN
            LEAVE loop_label;
        END IF;
    END LOOP;

    SELECT CONCAT('testloop_', v_val) AS tname;
END$$
DELIMITER ;

CALL sp_testloop(1000, 0);

適用場景:循環次數動態決定、需在循環體中間多點判斷退出。

3. REPEAT 循環 — 後測試循環(至少執行一次)

DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_test_repeat`$$
CREATE PROCEDURE `sp_test_repeat`(
    IN p_number INT,
    IN p_startid INT
)
BEGIN
    DECLARE v_val INT DEFAULT 0;
    SET v_val = p_startid;

    REPEAT
        SET v_val = v_val + 1;
    UNTIL v_val > p_number   -- 注意:UNTIL 後**不加分號**
    END REPEAT;

    SELECT CONCAT('test', v_val) AS tname;
END$$
DELIMITER ;

CALL sp_test_repeat(1000, 0);

語法陷阱:UNTIL condition 後**不能加分號**,否則報語法錯誤。

三種循環對比選型指南

循環類型判斷時機最少執行次數典型場景
WHILE迭代前0已知上限、預先檢查條件
LOOP內部手動1複雜中斷邏輯、多退出點
REPEAT迭代後1至少執行一次、後置條件

進階技巧:巢狀循環與多層跳出

outer: BEGIN
    inner: LOOP
        -- ...
        IF condition THEN LEAVE outer; END IF;  -- 直接跳出外層
    END LOOP inner;
END outer;

善用標籤實現多層流程控制,避免旗標變數汙染邏輯。

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