MySQLのストアドプロシージャでループ処理を行う方法【REPEAT文の使い方】
MySQLストアドプロシージャでのループ処理の基本
MySQLのストアドプロシージャ内で繰り返し処理を実行したい場合は、REPEAT文を使用します。REPEAT文は「後判定ループ」と呼ばれる形式で、条件の判定を処理の最後に行うため、最低でも1回は必ず実行されるのが特徴です。
ここでは、1から指定した値までの数値を順番に出力するサンプルプロシージャを作成し、その動きを確認していきます。
ストアドプロシージャの作成手順
まず、DELIMITERコマンドで区切り文字を変更してから、プロシージャを定義します。
mysql> DELIMITER //
mysql> CREATE PROCEDURE do_WhileDemo(LastValue INT)
-> BEGIN
-> SET @loop = 0;
-> REPEAT
-> SET @loop = @loop + 1;
-> SELECT @loop;
-> UNTIL @loop > LastValue
-> END REPEAT;
-> END //
Query OK, 0 rows affected (0.17 sec)
mysql> DELIMITER ;
コードのポイント解説
- DELIMITER //:プロシージャ内ではセミコロン(;)が複数登場するため、定義の終了を明示するために一時的に区切り文字を「//」へ変更しています。定義完了後に元の「;」へ戻すのを忘れないようにしましょう。
- SET @loop = 0;:ユーザー変数
@loopを初期化し、ループカウンタとして使用します。 - REPEAT 〜 UNTIL 〜 END REPEAT:条件式(
@loop > LastValue)が真になるまで、内部の処理を繰り返します。 - SELECT @loop;:現在のカウンタ値を都度出力し、ループの進行状況を確認できるようにしています。
ストアドプロシージャの呼び出し方
作成したプロシージャは、CALLコマンドを使って実行します。引数として10を渡してみましょう。
mysql> call do_WhileDemo(10);
実行結果
実行すると、以下のように@loopの値が1から順に出力されます(途中の出力は省略)。
+-------+ | @loop | +-------+ | 1 | +-------+ 1 row in set (0.00 sec) +-------+ | @loop | +-------+ | 2 | +-------+ 1 row in set (0.01 sec) :(中略:3〜10も同様に出力される) +-------+ | @loop | +-------+ | 11 | +-------+ 1 row in set (0.09 sec) Query OK, 0 rows affected (0.10 sec)
なぜ11まで出力されるのか?
引数に10を渡したのに、出力が11まで続いている点に注目してください。これはREPEAT文が後判定であることに起因します。@loopが10になった時点ではまだ条件「@loop > LastValue」が偽のため、もう1周して11になった段階で初めて条件が真となり、ループが終了します。
もし「10で止めたい」場合は、条件を次のように変更します。
-> UNTIL @loop >= LastValue
まとめ
MySQLのストアドプロシージャでは、REPEAT文のほかにWHILE文(前判定ループ)やLOOP文(LEAVE/ITERATEと組み合わせる無限ループ)も利用できます。それぞれ判定タイミングや制御方法が異なるため、処理内容に応じて適切な構文を選ぶことで、より柔軟なバッチ処理やデータ操作が実現できます。
-
MySQLストアドプロシージャで条件分岐を正しく実装する方法を解説
MySQLストアドプロシージャにおける条件分岐の基本MySQLのストアドプロシージャ内で条件を設定するには、IF ... THEN ... ELSE ... END IF構文を使用します。基本的な書式は以下のとおりです。if yourCondition then yourStatement1; else yourStatement2; end if; end //この構文を使うことで、条件が真(true)の場合はTHEN以降の処理が実行され、偽(false)の場合はELSE以降の処理が実行されます。 実際の実装例それでは、上記の構文をもとに、具体的なストアドプロシージャを作成し
-
MySQLストアドプロシージャにおけるDELIMITERの正しい使い方を徹底解説
DELIMITERとは?なぜ必要なのかMySQLクライアントは、デフォルトでセミコロン(;)を文の終端記号として扱います。しかし、ストアドプロシージャの本体には複数のSQL文が含まれ、それぞれがセミコロンで終わるため、そのまま定義すると途中で構文解析が中断されてしまいます。そこで、DELIMITERコマンドを使って、一時的に区切り文字を別の記号(例://)に変更する必要があります。これにより、プロシージャ全体をひとつのまとまりとして登録できるようになります。DELIMITERの正しい記述方法基本的な書き方は以下の通りです。DELIMITER //CREATE PROCEDURE yourSto