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

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句)や入力値の検証を併用することを推奨します。

  1. 【MySQL】ストアドプロシージャでパラメータを受け取り、動的SQLのLIKE句を使って新しいテーブルを作成する方法

    はじめにMySQLでは、ストアドプロシージャ内でパラメータを受け取り、その値を動的に組み立てたSQLのLIKE句に反映させて、新しいテーブルを作成することができます。このような処理にはプリペアドステートメント(PREPARE / EXECUTE)を使用します。本記事では、サンプルテーブルの作成からストアドプロシージャの定義、実行結果の確認まで、手順を追って解説します。1. サンプルテーブルの作成まず、元となるテーブル「DemoTable1973」を作成します。mysql> create table DemoTable1973     (  

  2. 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コマン