MySQLのWHILEループステートメントをストアドプロシージャで使う方法を解説
MySQLには、条件に基づいてSQLコードのブロックを繰り返し実行するためのループステートメントが用意されています。その中の一つがWHILEループです。本記事では、WHILEループの基本構文と、ストアドプロシージャ内での具体的な使い方を解説します。
WHILEループの基本構文
WHILEループの構文は以下の通りです。
WHILE expression DO statements END WHILE
WHILEループの仕組み
WHILEループは、各反復(イテレーション)の開始時点で条件式を評価します。条件式がTRUEと評価された場合、MySQLはWHILEとEND WHILEの間にあるステートメントを実行し続け、条件式がFALSEになるまで繰り返します。
重要なポイントとして、WHILEループはステートメントを実行する前に条件式をチェックします。この特性から、「事前判定ループ(pretest loop)」とも呼ばれています。つまり、最初から条件がFALSEであれば、ループ内の処理は一度も実行されません。
ストアドプロシージャでの使用例
ここでは、1から10までの数値をカンマ区切りで連結する文字列を作成するストアドプロシージャを例に、WHILEループの使い方を見ていきましょう。
mysql> DELIMITER //
mysql> CREATE PROCEDURE While_Loop()
-> BEGIN
-> DECLARE A INT;
-> DECLARE XYZ VARCHAR(50);
-> SET A = 1;
-> SET XYZ = '';
-> WHILE A <= 10 DO
-> SET XYZ = CONCAT(XYZ, A, ',');
-> SET A = A + 1;
-> END WHILE;
-> SELECT XYZ;
-> END //
Query OK, 0 rows affected (0.31 sec)コードのポイント
- DECLARE文:カウンタ変数「A」と結果格納用の文字列変数「XYZ」を宣言しています。
- 初期化:Aを1に、XYZを空文字列に設定します。
- ループ処理:Aが10以下である限り、CONCAT関数で現在のAの値とカンマをXYZに連結し、Aを1ずつ増加させます。
実行結果の確認
作成したプロシージャを呼び出すと、以下のような結果が得られます。
mysql> DELIMITER ; mysql> CALL While_Loop(); +-----------------------+ | XYZ | +-----------------------+ | 1,2,3,4,5,6,7,8,9,10, | +-----------------------+ 1 row in set (0.03 sec)
このように、WHILEループを使うことで、条件が満たされている間だけ繰り返し処理を行うストアドプロシージャを簡単に実装できます。なお、DELIMITERコマンドはストアドプロシージャ内のセミコロンがクライアントによって誤って解釈されるのを防ぐために一時的に変更しており、プロシージャ作成後に元に戻しています。
-
MySQLのストアドプロシージャでループ処理を行う方法【REPEAT文の使い方】
MySQLストアドプロシージャでのループ処理の基本 MySQLのストアドプロシージャ内で繰り返し処理を実行したい場合は、REPEAT文を使用します。REPEAT文は「後判定ループ」と呼ばれる形式で、条件の判定を処理の最後に行うため、最低でも1回は必ず実行されるのが特徴です。 ここでは、1から指定した値までの数値を順番に出力するサンプルプロシージャを作成し、その動きを確認していきます。 ストアドプロシージャの作成手順 まず、DELIMITERコマンドで区切り文字を変更してから、プロシージャを定義します。 mysql> DELIMITER // mysql> CREATE PROCE
-
MySQLでSELECTステートメントを使ってストアドプロシージャを呼び出す方法
MySQLでは、FROM句の中でストアドプロシージャを直接指定してSELECTすることはできません。代わりにCALLコマンドを使ってプロシージャを呼び出し、その後でSELECTステートメントを実行して結果を確認する流れになります。この記事では、実際にテーブルとストアドプロシージャを作成し、CALLで呼び出してからSELECTでデータを取得するまでの手順を順番に解説します。1. サンプルテーブルを作成するまずはデータを格納するためのテーブルを作成しましょう。以下の例では、顧客ID・顧客名・出荷日時を持つテーブルを定義しています。mysql> create table DemoTable2