【MySQL】ストアドプロシージャでLIMIT句に変数を使用する方法
はじめに
MySQLのストアドプロシージャでは、LIMIT句に直接パラメータや変数を指定することができません。そのため、プリペアドステートメント(PREPARE/EXECUTE)を組み合わせて、値を動的に渡す必要があります。
本記事では、サンプルテーブルの作成からデータ挿入、そして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 / @ending:
EXECUTE ... 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アプリケーションの一覧画面などで、任意の範囲のデータだけを効率よく取り出したい場合にぜひ活用してください。
-
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, ,
-
MySQLストアドプロシージャでカラムの値を変数に格納する方法
MySQLのストアドプロシージャ内で変数を宣言するには、DECLARE文を使用します。さらにSELECT ~ INTO構文を組み合わせることで、テーブルのカラム値を変数に格納することができます。ここでは、実際にサンプルテーブルを作成し、ストアドプロシージャ経由でカラムの値を変数に取得する手順を解説します。1. サンプルテーブルの作成まず、以下のようにテーブルを作成します。mysql> create table DemoTable2034-> (-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,-> StudentN