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

MySQL 儲存過程循環構造全解析:WHILE、LOOP、REPEAT 與 LEAVE 跳出實戰

     編輯:MySQL 綜合教學

三大循環語法對比

循環類型判斷時機適用場景跳出關鍵字
WHILE**前置判斷**已知次數或條件預檢LEAVE label
LOOP**無條件** (需內部 LEAVE)複雜邏輯、多條件退出LEAVE label
REPEAT**後置判斷** (UNTIL)至少執行一次UNTIL condition

1. WHILE 循環範例

DELIMITER $$
CREATE PROCEDURE sp_test_while(IN p_max INT, IN p_start INT)
BEGIN
  DECLARE v_val INT DEFAULT p_start;
  outer_label: BEGIN
    WHILE v_val <= p_max DO
      SET v_val = v_val + 1;
      IF v_val = 100 THEN
        LEAVE outer_label;  -- 跳出標籤塊,後續 SELECT 不執行
      END IF;
    END WHILE;
    SELECT '我在 outer_label 內,LEAVE 後不會執行';
  END outer_label;
  SELECT CONCAT('test', v_val) AS tname;  -- 正常輸出
END$$
DELIMITER ;

CALL sp_test_while(1000, 0);

關鍵點:LEAVE label 跳出的是**標籤塊**,而非僅循環體。標籤可標註 BEGIN...END、LOOP、WHILE、REPEAT。

2. LOOP 循環範例

DELIMITER $$
CREATE PROCEDURE sp_test_loop(IN p_max INT, IN p_start INT)
BEGIN
  DECLARE v_val INT DEFAULT p_start;
  loop_label: LOOP
    SET v_val = v_val + 1;
    IF v_val > p_max THEN
      LEAVE loop_label;
    END IF;
  END LOOP;
  SELECT CONCAT('testloop_', v_val) AS tname;
END$$
DELIMITER ;

CALL sp_test_loop(1000, 0);

3. REPEAT 循環範例

DELIMITER $$
CREATE PROCEDURE sp_test_repeat(IN p_max INT, IN p_start INT)
BEGIN
  DECLARE v_val INT DEFAULT p_start;
  REPEAT
    SET v_val = v_val + 1;
  UNTIL v_val > p_max  -- 注意:UNTIL 後**不加分號**
  END REPEAT;
  SELECT CONCAT('test', v_val) AS tname;
END$$
DELIMITER ;

CALL sp_test_repeat(1000, 0);

進階技巧:ITERATE 繼續下一次迭代

loop_label: LOOP
  SET v_val = v_val + 1;
  IF v_val % 2 = 0 THEN
    ITERATE loop_label;  -- 跳過本次剩餘邏輯,直接下一輪
  END IF;
  -- 只處理奇數
  INSERT INTO log_table VALUES (v_val);
  IF v_val > 100 THEN LEAVE loop_label; END IF;
END LOOP;

避坑清單

  • DELIMITER:建立過程前必須修改,結束後恢復 ;。
  • UNTIL 後不加分號:UNTIL condition END REPEAT;。
  • LEAVE 跳出標籤塊:標籤必須在 BEGIN 或循環關鍵字前聲明。
  • 變量聲明在開頭:DECLARE 必須在 BEGIN 之後、其他語句之前。
  • MySQL 不支援 FOR 循環,僅有上述三種。

效能建議

  • 大量資料處理優先用 **單條 SQL (INSERT...SELECT, UPDATE...JOIN)** 替代循環。
  • 必須循環時,控制迴圈次數,避免長事務鎖表。
  • 配合 autocommit=0 批次提交,減少日誌刷盤。

掌握三大循環與流程控制,靈活編寫高效儲存過程。

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