MySQL の LOOP 文

ここでは MySQL の LOOP 文についてご説明します。

MySQL の LOOP 文の使い方

MySQL では、ストーアドプログラム内のフロー制御で LOOP 文を使って、繰り返しステートメントを実行することができます。

LOOP 文の基本的な構文は次の通りです。

開始ラベル: LOOP
	繰り返したいステートメント(LEAVE 文を含む)
END LOOP 終了ラベル;

LOOP 文では「繰り返したいステートメント」をずっと繰り返し実行します。

通常、繰り返したいステートメントの中で、LEAVE 文を使ってループを抜けます。

ストアードファンクションの時は RETURN 文を使ってループを抜けてファンクションの実行を終えることも可能です。

開始と終了ラベルは一応オプショナルですが、LEAVE 文を使うのでつけて使います。


それでは、LOOP 文を実際に使ってみましょう。

今回は LOOP 文を使って、引数として渡した start_idx から end_idx までの数をカンマでつなげるだけのストアードプロシージャを作ります。

DROP PROCEDURE IF EXISTS test;
DELIMITER //
CREATE PROCEDURE test (start_idx INT, end_idx INT)
BEGIN

	DECLARE result VARCHAR(500) DEFAULT '';

	loop1: LOOP
		SET result = CONCAT(result, start_idx, ',');
		SET start_idx = start_idx + 1;
        
        IF start_idx > end_idx THEN
			LEAVE loop1;
        END IF;
	END LOOP loop1;

	IF CHAR_LENGTH(result) > 1 THEN
		SET result = LEFT(result, CHAR_LENGTH(result) - 1);
    END IF;
    
	SELECT result;
    
END//
DELIMITER ;

8 ~ 15 行目で LOOP 文を使っています。

LOOP と END LOOP の間の 9 ~ 14 行目のステートメントが繰り返し実行されます。

9 行目では result という変数に start_idx とカンマを追加しています。

10 行目では start_idx に 1 を足しています。

11 ~ 14 行目で start_idx > end_idx かチェックし、True の時は LEAVE 文で LOOP を抜けています。

17 ~ 19 行目は result の一番後ろのカンマを取り除いているだけです。


このストアードプロシージャを作成して、start_idx = 1、end_idx = 10 で実行すると次のようになります。

CALL test(1, 10);

[実行結果]

MySQL の LOOP 1

MySQL の LOOP 2

result に 1,2,3,4,5,6,7,8,9,10 が入っていて、10 回ループされて、start_idx > end_idx となった時点で LOOP を抜けていることがわかります。


MySQL の LOOP 文で CONTINUE する (ITERATE)

MySQL で LOOP 文の途中で、その後のステートメントをスキップしてループの実行を続けたい(CONTINUE したい)時には、ITERATE 文を使って行うことができます。

ITERATE 文は ITERATE ラベル名; のように使い、指定したラベルのループを最初から実行します。

ラベル名: LOOP
	...
	ITERATE ラベル名;
	...
END LOOP ラベル名

例えば、ITERATE 文を使って、start_idx が偶数の時のみ result に文字列を追加したいのであれば、次のようにできます。

DROP PROCEDURE IF EXISTS test;
DELIMITER //
CREATE PROCEDURE test (start_idx INT, end_idx INT)
BEGIN

	DECLARE result VARCHAR(500) DEFAULT '';

	loop1: LOOP
    	IF start_idx % 2 = 1 THEN
			SET start_idx = start_idx + 1;
			ITERATE loop1;
		END IF;  
        
		SET result = CONCAT(result, start_idx, ',');
		SET start_idx = start_idx + 1;
        
        IF start_idx > end_idx THEN
			LEAVE loop1;
        END IF;
	END LOOP loop1;

	IF CHAR_LENGTH(result) > 1 THEN
		SET result = LEFT(result, CHAR_LENGTH(result) - 1);
    END IF;
    
	SELECT result;
    
END//
DELIMITER ;

9 ~ 12 行目で start_idx を 2 で割った余りが 1 の時は start_idx に 1 を足してから、ITERATE loop1; でループの最初から実行するようにしています。

ここで ITERATE 文の前に start_idx に 1 を足すのを忘れると、無限ループになってしまうのでお気をつけくださいね。


このクエリーを実行して test ストアードプロシージャを再生成し、start_idx = 1、end_idx = 10 で実行すると次のようになります。

CALL test(1, 10);

[実行結果]

MySQL の LOOP 3

result には 2,4,6,8,10 が入っていて、奇数の時は ITERATE 文以降のステートメントが実行されずに、ループが継続されているのがわかります。


以上、MySQL の LOOP 文についてご説明しました。

© 2024 MySQL 入門