MySQLのLOOPステートメントをストアドプロシージャで活用する方法
MySQLには、コードブロックを繰り返し実行するためのLOOPステートメントが用意されています。さらに、ループラベルを使用できる柔軟性も備わっています。
ループの流れを制御するために、以下の2つのステートメントが利用できます。
LEAVEステートメント
条件判定を待たずに、ループから即座に抜け出す(終了する)ためのステートメントです。
ITERATEステートメント
それ以降のコード処理をスキップし、次の反復(イテレーション)を新たに開始するためのステートメントです。
ストアドプロシージャでの使用例
ここでは、LOOPステートメントとストアドプロシージャを組み合わせた実際の使用例を紹介します。以下のストアドプロシージャは、2, 4, 6, 8のような偶数をつなげた文字列を構築するものです。
mysql> Delimiter //
mysql> CREATE PROCEDURE LOOP_loop()
-> BEGIN
-> DECLARE A INT;
-> DECLARE XYZ VARCHAR(255);
-> SET A = 1;
-> SET XYZ = '';
-> loop_label: LOOP
-> IF A > 10 THEN
-> LEAVE loop_label;
-> END IF;
-> SET A = A + 1;
-> IF (A mod 2) THEN
-> ITERATE loop_label;
-> ELSE
-> SET XYZ = CONCAT(XYZ,A,',');
-> END IF;
-> END LOOP;
-> SELECT XYZ;
-> END //
Query OK, 0 rows affected (0.07 sec)
このプロシージャを呼び出すと、以下のような結果が得られます。
mysql> DELIMITER ;
mysql> CALL LOOP_loop ();
+-------------+
| XYZ |
+-------------+
| 2,4,6,8,10, |
+-------------+
1 row in set (0.04 sec)
Query OK, 0 rows affected (0.04 sec)
動作の仕組み
上記のクエリの処理内容を整理すると、次のようになります。
- A の値が 10 より大きい場合:LEAVEステートメントによってループが終了します。
- A の値が奇数の場合:ITERATEステートメントが以降の処理をすべてスキップし、新しい反復を開始します。
- A の値が偶数の場合:ELSEブロック内の処理が実行され、CONCAT関数によって偶数が文字列XYZに追加されていきます。
このように、LOOPステートメントとLEAVE・ITERATEを組み合わせることで、条件に応じた柔軟な繰り返し処理をストアドプロシージャ内で実現できます。
-
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