MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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と組み合わせる無限ループ)も利用できます。それぞれ判定タイミングや制御方法が異なるため、処理内容に応じて適切な構文を選ぶことで、より柔軟なバッチ処理やデータ操作が実現できます。

  1. MySQLストアドプロシージャで条件分岐を正しく実装する方法を解説

    MySQLストアドプロシージャにおける条件分岐の基本MySQLのストアドプロシージャ内で条件を設定するには、IF ... THEN ... ELSE ... END IF構文を使用します。基本的な書式は以下のとおりです。if yourCondition then yourStatement1; else yourStatement2; end if; end //この構文を使うことで、条件が真(true)の場合はTHEN以降の処理が実行され、偽(false)の場合はELSE以降の処理が実行されます。 実際の実装例それでは、上記の構文をもとに、具体的なストアドプロシージャを作成し

  2. MySQLストアドプロシージャにおけるDELIMITERの正しい使い方を徹底解説

    DELIMITERとは?なぜ必要なのかMySQLクライアントは、デフォルトでセミコロン(;)を文の終端記号として扱います。しかし、ストアドプロシージャの本体には複数のSQL文が含まれ、それぞれがセミコロンで終わるため、そのまま定義すると途中で構文解析が中断されてしまいます。そこで、DELIMITERコマンドを使って、一時的に区切り文字を別の記号(例://)に変更する必要があります。これにより、プロシージャ全体をひとつのまとまりとして登録できるようになります。DELIMITERの正しい記述方法基本的な書き方は以下の通りです。DELIMITER //CREATE PROCEDURE yourSto