【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句に反映した新しいテーブルを作成できます。検索条件に応じたテーブル生成やデータ抽出を自動化したい場合に非常に役立つテクニックなので、ぜひ活用してください。
-
MySQLストアドプロシージャでDELIMITER(区切り文字)を正しく使って値を挿入する方法
MySQLでストアドプロシージャを作成する際、DELIMITER(区切り文字)の扱いに戸惑う方は少なくありません。デフォルトではMySQLクライアントがセミコロン「;」を文の終端として解釈するため、プロシージャ内の複数のSQL文が途中で分割されてしまうことがあります。本記事では、区切り文字を正しく変更しながら、ストアドプロシージャを使ってテーブルへ値を挿入する具体的な手順を解説します。 1. サンプルテーブルを作成する まず、データを挿入するためのテーブルを作成します。ここでは学生の名前と姓を格納するテーブルを用意しました。 mysql> create table DemoTable
-
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コマン