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

【MySQL】ストアドプロシージャでLIMIT句に変数を使用する方法

はじめに

MySQLのストアドプロシージャでは、LIMIT句に直接パラメータや変数を指定することができません。そのため、プリペアドステートメント(PREPAREEXECUTE)を組み合わせて、値を動的に渡す必要があります。
本記事では、サンプルテーブルの作成からデータ挿入、そしてLIMIT句に変数を利用できるストアドプロシージャの実装・実行までの手順を、実際のコード例とともにわかりやすく解説します。

1. サンプルテーブルの作成

まず、以下のCREATE TABLE文でテーブルを作成します。

mysql> create table LimitWithStoredProcedure
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name varchar(10)
    -> );
Query OK, 0 rows affected (0.47 sec)

2. レコードの挿入

次に、INSERT文を使ってテーブルにデータを登録します。

mysql> insert into LimitWithStoredProcedure(Name) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Chris');
Query OK, 1 row affected (0.15 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Maxwell');
Query OK, 1 row affected (0.28 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Bob');
Query OK, 1 row affected (0.24 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('David');
Query OK, 1 row affected (0.20 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Carol');
Query OK, 1 row affected (0.18 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('James');
Query OK, 1 row affected (0.29 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Jace');
Query OK, 1 row affected (0.13 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Robert');
Query OK, 1 row affected (0.20 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Mike');
Query OK, 1 row affected (0.07 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Sam');
Query OK, 1 row affected (0.25 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Peter');
Query OK, 1 row affected (0.14 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Ramit');
Query OK, 1 row affected (0.18 sec)
mysql> insert into LimitWithStoredProcedure(Name) values('Tony');
Query OK, 1 row affected (0.16 sec)

3. 登録データの確認

SELECT文で、登録されたすべてのレコードを表示してみましょう。

mysql> select *from LimitWithStoredProcedure;

実行結果:

+----+---------+
| Id | Name    |
+----+---------+
| 1  | John    |
| 2  | Chris   |
| 3  | Maxwell |
| 4  | Bob     |
| 5  | David   |
| 6  | Carol   |
| 7  | James   |
| 8  | Jace    |
| 9  | Robert  |
| 10 | Mike    |
| 11 | Sam     |
| 12 | Peter   |
| 13 | Ramit   |
| 14 | Tony    |
+----+---------+
14 rows in set (0.00 sec)

4. LIMIT句で変数を使用するストアドプロシージャの作成

ここが本題です。LIMIT句の値を引数として受け取れるようにするには、PREPAREステートメントとEXECUTEを組み合わせます。以下がそのストアドプロシージャのコードです。

mysql> DELIMITER //
mysql> CREATE PROCEDURE Sp_limit(IN beg INTEGER, IN end INTEGER )
   -> BEGIN
      -> PREPARE myStatement FROM
      -> "select *from LimitWithStoredProcedure LIMIT ?,? ";
      -> SET @beginning = beg;
      -> SET @ending = end ;
      -> EXECUTE myStatement USING @beginning, @ending;
      -> DEALLOCATE PREPARE myStatement;
   -> END //
Query OK, 0 rows affected (0.25 sec)
mysql> DELIMITER ;

コードのポイント解説

  • DELIMITER //:プロシージャ内部のセミコロン(;)がSQLの区切り文字として誤って解釈されないよう、一時的にデリミタを変更しています。定義完了後は必ず元に戻しましょう。
  • IN パラメータ(beg / end):呼び出し側から値を受け取る入力専用の引数です。第1引数は開始位置(オフセット)、第2引数は「終了位置」ではなく取得する行数である点に注意してください。
  • SET @beginning / @endingEXECUTE ... USINGで渡せるのはユーザー定義変数(@付き変数)のみのため、引数の値をユーザー定義変数に代入しています。
  • DEALLOCATE PREPARE:使い終わったプリペアドステートメントを明示的に解放し、リソースをクリーンアップします。

5. ストアドプロシージャの呼び出し

作成したプロシージャは、CALL文で実行できます。ここでは、オフセット4・取得件数7を指定してみます。

mysql> call Sp_limit(4,7);

実行結果:

+----+--------+
| Id | Name   |
+----+--------+
| 5  | David  |
| 6  | Carol  |
| 7  | James  |
| 8  | Jace   |
| 9  | Robert |
| 10 | Mike   |
| 11 | Sam    |
+----+--------+
7 rows in set (0.00 sec)
Query OK, 0 rows affected (0.03 sec)

まとめ

実行結果を見ると、Id=5(David)から始まる7件のレコードが返されています。これはLIMIT句のオフセットが0始まりであるため、オフセット4を指定すると「先頭の4行をスキップした位置」から取得が始まるからです。
この手法を活用すれば、ストアドプロシージャ経由でも柔軟なページング処理(ページネーション)を実現できます。Webアプリケーションの一覧画面などで、任意の範囲のデータだけを効率よく取り出したい場合にぜひ活用してください。

  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ストアドプロシージャでカラムの値を変数に格納する方法

    MySQLのストアドプロシージャ内で変数を宣言するには、DECLARE文を使用します。さらにSELECT ~ INTO構文を組み合わせることで、テーブルのカラム値を変数に格納することができます。ここでは、実際にサンプルテーブルを作成し、ストアドプロシージャ経由でカラムの値を変数に取得する手順を解説します。1. サンプルテーブルの作成まず、以下のようにテーブルを作成します。mysql> create table DemoTable2034-> (-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,-> StudentN