MySQLストアドプロシージャ内で動的SQLクエリを実装する方法
ストアドプロシージャ内で動的SQLクエリを実行するには、PREPARE STATEMENT(プリペアドステートメント)の仕組みを利用します。まずはサンプル用のテーブルを作成しましょう。
1. テーブルの作成
mysql> create table DemoTable2033
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (1.61 sec)2. レコードの挿入
INSERTコマンドを使って、テーブルにいくつかのレコードを挿入します。
mysql> insert into DemoTable2033(Name) values('Chris');
Query OK, 1 row affected (0.85 sec)
mysql> insert into DemoTable2033(Name) values('Bob');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable2033(Name) values('David');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable2033(Name) values('Mike');
Query OK, 1 row affected (0.12 sec)3. データの確認
SELECT文でテーブル内の全レコードを表示して、データが正しく登録されているか確認します。
mysql> select *from DemoTable2033;
実行すると、以下のような結果が出力されます。
+----+-------+ | Id | Name | +----+-------+ | 1 | Chris | | 2 | Bob | | 3 | David | | 4 | Mike | +----+-------+ 4 rows in set (0.00 sec)
4. 動的SQLを実装したストアドプロシージャの作成
次に、動的SQLを実装するストアドプロシージャを作成します。ポイントは以下の手順です。
- SET @query = CONCAT(...): 実行したいSQL文を文字列として組み立てる
- PREPARE: 文字列化したSQLをプリペアドステートメントとして準備する
- EXECUTE: 準備したステートメントを実行する
mysql> delimiter //
mysql> create procedure dynamic_query()
-> begin
-> set @query=concat("select *from DemoTable2033 where Id=3");
-> prepare st from @query;
-> execute st;
-> end
-> //
Query OK, 0 rows affected (0.13 sec)
mysql> delimiter ;5. ストアドプロシージャの呼び出し
作成したストアドプロシージャをCALL文で実行します。
mysql> call dynamic_query();
実行結果は以下のとおりです。Id=3のレコードだけが取得されていることがわかります。
+----+-------+ | Id | Name | +----+-------+ | 3 | David | +----+-------+ 1 row in set (0.04 sec) Query OK, 0 rows affected (0.05 sec)
まとめ
このように、ストアドプロシージャ内でCONCAT関数でSQL文を動的に組み立て、PREPAREとEXECUTEを組み合わせることで、条件を柔軟に変更できる動的クエリを実現できます。なお、ユーザー入力を直接連結する場合はSQLインジェクションのリスクがあるため、実運用ではプレースホルダ(USING句)や入力値の検証を併用することを推奨します。
-
【MySQL】ストアドプロシージャでパラメータを受け取り、動的SQLのLIKE句を使って新しいテーブルを作成する方法
はじめにMySQLでは、ストアドプロシージャ内でパラメータを受け取り、その値を動的に組み立てたSQLのLIKE句に反映させて、新しいテーブルを作成することができます。このような処理にはプリペアドステートメント(PREPARE / EXECUTE)を使用します。本記事では、サンプルテーブルの作成からストアドプロシージャの定義、実行結果の確認まで、手順を追って解説します。1. サンプルテーブルの作成まず、元となるテーブル「DemoTable1973」を作成します。mysql> create table DemoTable1973 (  
-
MySQLストアドプロシージャ内で動的SQLクエリを実装する方法
ストアドプロシージャ内で動的SQLクエリを実行するには、PREPARE STATEMENT(プリペアドステートメント)の仕組みを利用します。まずはサンプル用のテーブルを作成しましょう。1. テーブルの作成mysql> create table DemoTable2033 -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> Name varchar(20) -> ); Query OK, 0 rows affected (1.61 sec)2. レコードの挿入INSERTコマン