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

MySQLストアドプロシージャでカーソルを使ってテーブルから行を取得する方法

MySQLのストアドプロシージャでは、カーソル(CURSOR)を使用することで、SELECT文の結果セットから1行ずつデータを取り出して処理することができます。本記事では、実際にカーソルを定義し、テーブルの「Name」列からレコードを順番にフェッチするストアドプロシージャの作成方法を解説します。

サンプルデータの確認

まず、対象となるテーブル「student_info」には以下のようなデータが格納されているものとします。

mysql> Select * from Student_info;
+-----+---------+------------+------------+
| id  | Name    | Address    | Subject    |
+-----+---------+------------+------------+
| 101 | YashPal | Amritsar   | History    |
| 105 | Gaurav  | Chandigarh | Literature |
| 125 | Raman   | Shimla     | Computers  |
| 127 | Ram     | Jhansi     | Computers  |
+-----+---------+------------+------------+
4 rows in set (0.00 sec)

カーソルを使用したストアドプロシージャの作成

次に、カーソルを定義して「Name」列の値を1行ずつフェッチするストアドプロシージャを作成します。

mysql> Delimiter //

mysql> CREATE PROCEDURE cursor_defined(OUT val VARCHAR(20))
    -> BEGIN
    -> DECLARE a,b VARCHAR(20);
    -> DECLARE cur_1 CURSOR for SELECT Name from student_info;
    -> DECLARE CONTINUE HANDLER FOR NOT FOUND
    -> SET b = 1;
    -> OPEN CUR_1;
    -> REPEAT
    -> FETCH CUR_1 INTO a;
    -> UNTIL b = 1
    -> END REPEAT;
    -> CLOSE CUR_1;
    -> SET val = a;
    -> END//
Query OK, 0 rows affected (0.04 sec)

mysql> Delimiter ;

処理の流れのポイント

  • DECLARE cur_1 CURSOR FOR〜:「student_info」テーブルの「Name」列を抽出するSELECT文に対して、カーソル「cur_1」を宣言しています。
  • DECLARE CONTINUE HANDLER FOR NOT FOUND:フェッチする行がなくなった(NOT FOUND)場合に、変数bに1をセットするハンドラを定義しています。これによりループの終了条件を制御できます。
  • OPEN / FETCH / CLOSE:OPENでカーソルを開き、REPEAT〜END REPEAT内のFETCHで1行ずつ変数aに値を取り込みます。すべての行を読み終えたらCLOSEでカーソルを閉じます。
  • SET val = a:最後に、OUTパラメータvalに変数aの値を代入して呼び出し元へ返します。

プロシージャの実行と結果

作成したストアドプロシージャをCALL文で呼び出し、OUTパラメータの値を確認してみましょう。

mysql> Call cursor_defined(@val);
Query OK, 0 rows affected (0.11 sec)

mysql> Select @val;
+------+
| @val |
+------+
| Ram  |
+------+
1 row in set (0.00 sec)

上記の実行結果から、OUTパラメータであるvalに「Ram」という値が格納されていることがわかります。これは、REPEATループによって「Name」列のすべての行が順番にフェッチされ、最後に読み込まれた行(id=127の「Ram」)の値が変数aに残るためです。つまり、このプロシージャはカーソルで全行を走査した結果、最終行の値を返す動作になっています。

このように、MySQLのストアドプロシージャではカーソルとCONTINUE HANDLERを組み合わせることで、結果セットの各行に対して柔軟な繰り返し処理を実装できます。実際の開発では、フェッチした各行に対して集計や条件分岐などの処理を追加することも可能です。

  1. MySQL Workbenchでストアドプロシージャを作成・実行する方法

    MySQL Workbenchでストアドプロシージャを作成する手順 まずは、ストアドプロシージャを作成してみましょう。以下は、MySQL Workbenchを使用してストアドプロシージャを作成するためのクエリ例です。 use business; DELIMITER // DROP PROCEDURE IF EXISTS SP_GETMESSAGE; CREATE PROCEDURE SP_GETMESSAGE() BEGIN DECLARE MESSAGE VARCHAR(100); SET MESSAGE="HELLO"; SELECT CONCAT(MESSAGE, ,

  2. MySQLストアドプロシージャでSHOW CREATE TABLEを実行する方法

    MySQLストアドプロシージャでSHOW CREATE TABLEを実行する方法 ストアドプロシージャの中でSHOW CREATE TABLEを実行したい場合は、動的SQL(プリペアドステートメント)を利用します。SHOW系のコマンドはプロシージャ内に直接記述できないため、SQL文を文字列として組み立てて実行するのがポイントです。 まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable2011 -> ( -> StudentId int NOT NULL AUTO_INCREMENT, -> St