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

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

はじめに

MySQLでは、ストアドプロシージャ内でパラメータを受け取り、その値を動的に組み立てたSQLのLIKE句に反映させて、新しいテーブルを作成することができます。このような処理にはプリペアドステートメント(PREPARE / EXECUTE)を使用します。

本記事では、サンプルテーブルの作成からストアドプロシージャの定義、実行結果の確認まで、手順を追って解説します。

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

まず、元となるテーブル「DemoTable1973」を作成します。

mysql> create table DemoTable1973
    (
    StudentId int,
    StudentName varchar(20)
    );
Query OK, 0 rows affected (0.00 sec)

2. テストデータの挿入

INSERTコマンドを使って、いくつかのレコードを挿入します。

mysql> insert into DemoTable1973 values(101,'Chris');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1973 values(102,'John Doe');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1973 values(103,'David');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1973 values(104,'John Smith');
Query OK, 1 row affected (0.00 sec)

3. データの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1973;

実行結果は以下のとおりです。

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|       101 | Chris        |
|       102 | John Doe    |
|       103 | David       |
|       104 | John Smith  |
+-----------+-------------+
4 rows in set (0.00 sec)

4. ストアドプロシージャの作成

次に、プロシージャ呼び出し時に渡された値をLIKE句に組み込み、新しいテーブルを作成するストアドプロシージャを定義します。ポイントは以下の3点です。

  • DROP TABLE IF EXISTS:同名のテーブルが既に存在する場合でもエラーにならないよう、事前に削除します。
  • CONCAT():パラメータの値を文字列として連結し、「CREATE TABLE ... SELECT」文を動的に生成します。
  • PREPARE / EXECUTE:生成したSQL文字列をプリペアドステートメントとして準備・実行します。
mysql> DELIMITER //
mysql> create PROCEDURE demo_create(IN newTableName varchar(20),IN tbl varchar(20))
    BEGIN
       DROP TABLE IF EXISTS newTableName;
       SET @query= CONCAT('CREATE TABLE newTableName as SELECT * from DemoTable1973 WHERE StudentName like ''%',tbl,'%''');
       PREPARE ps FROM @query;
       EXECUTE ps;
     END
    //
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;

なお、このサンプルではテーブル名が固定の「newTableName」として扱われています。第1引数の値も動的に反映したい場合は、その値もCONCAT()の中に組み込む必要があります。

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

CALLコマンドでストアドプロシージャを実行します。第1引数に新しいテーブル名、第2引数に検索キーワードを渡します。ここでは「John」というキーワードを指定しています。

mysql> call demo_create('newTableName','John');
Query OK, 2 rows affected (0.00 sec)

6. 作成結果の確認

新しく作成されたテーブルの中身をSELECT文で確認します。

mysql> select * from newTableName;

実行結果は以下のとおりです。

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|       102 | John Doe    |
|       104 | John Smith  |
+-----------+-------------+
2 rows in set (0.00 sec)

StudentNameが「John」に部分一致する2件のレコードだけが、新しいテーブルにコピーされていることがわかります。

まとめ

このように、ストアドプロシージャ内でCONCAT()を使ってSQL文を動的に組み立て、PREPARE/EXECUTEで実行することで、パラメータとして受け取った値をLIKE句に反映した新しいテーブルを作成できます。検索条件に応じたテーブル生成やデータ抽出を自動化したい場合に非常に役立つテクニックなので、ぜひ活用してください。

  1. MySQLストアドプロシージャでDELIMITER(区切り文字)を正しく使って値を挿入する方法

    MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の扱いに戸惑う方は少なくありません。デフォルトではMySQLクライアントがセミコロン「;」を文の終端として解釈するため、プロシージャ内の複数のSQL文が途中で分割されてしまうことがあります。本記事では、区切り文字を正しく変更しながら、ストアドプロシージャを使ってテーブルへ値を挿入する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、データを挿入するためのテーブルを作成します。ここでは学生の名前と姓を格納するテーブルを用意しました。 mysql> create table DemoTable

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