MySQLストアドプロシージャの引数にテーブル名を渡してテーブルの全レコードを取得する方法
テーブル名を引数にして全レコードを動的に取得するストアドプロシージャ
MySQLのストアドプロシージャは通常、固定されたテーブルを対象に処理を行います。しかし、テーブル名をパラメータとして渡し、そのテーブルのすべてのレコードを動的に取得したいというケースもあります。
このような場合、CONCAT()関数でSQL文を文字列として組み立て、プリペアドステートメント(PREPARE / EXECUTE)を使って実行する方法が有効です。
プロシージャ「details」の作成例
以下の例では、テーブル名を引数として受け取る「details」というストアドプロシージャを作成しています。
mysql> DELIMITER //
mysql> CREATE PROCEDURE details(tab_name VARCHAR(40))
-> BEGIN
-> SET @t := CONCAT('Select * from', ' ', tab_name);
-> PREPARE stmt FROM @t;
-> EXECUTE stmt;
-> END //
Query OK, 0 rows affected (0.00 sec)
処理の流れ
- SET @t := CONCAT(...):引数として受け取ったテーブル名をもとに、「SELECT * FROM テーブル名」というSQL文を文字列として生成します。
- PREPARE stmt FROM @t:生成したSQL文をプリペアドステートメントとして準備します。
- EXECUTE stmt:準備したSQL文を実行し、結果セットを返します。
プロシージャの呼び出し方法
作成したプロシージャを呼び出すには、CALL文の引数に対象のテーブル名を指定します。以下の例では「student_detail」テーブルの全レコードが表示されます。
mysql> DELIMITER ;
mysql> CALL details('student_detail');
+-----------+-------------+------------+
| Studentid | StudentName | address |
+-----------+-------------+------------+
| 100 | Gaurav | Delhi |
| 101 | Raman | Shimla |
| 103 | Rahul | Jaipur |
| 104 | Ram | Chandigarh |
| 105 | Mohan | Chandigarh |
+-----------+-------------+------------+
5 rows in set (0.02 sec)
Query OK, 0 rows affected (0.03 sec)
注意点
テーブル名やカラム名は、プリペアドステートメントのプレースホルダ(?)として直接渡すことができないため、このようにSQL文を文字列として組み立てる必要があります。ただし、この手法はSQLインジェクションのリスクを伴うため、実際の運用では、引数として渡されたテーブル名が信頼できるものであることを確認するか、information_schemaを利用してテーブルの存在を検証してから実行することをおすすめします。
-
MySQLでテーブル内の重複レコードをすべて削除する方法
MySQLのテーブルから重複レコードを削除したい場合、DELETEコマンドを使用します。この記事では、実際にテーブルを作成し、重複データを挿入したうえで、DELETE文を使って重複レコードを削除する手順を具体的に解説します。 1. テーブルの作成 まず、練習用のテーブル「DuplicateDeleteDemo」を作成しましょう。このテーブルは、id(整数型)とname(可変長文字列)の2つのカラムを持つシンプルな構造です。 mysql> create table DuplicateDeleteDemo -> ( -> id int, -> name
-
MySQLテーブルのカラム名を取得する方法【SHOW・DESCRIBE活用ガイド】
SHOWコマンドでカラム名を取得するMySQLでは、SHOWコマンドを使うことで、テーブルのカラム(列)名を簡単に確認できます。カラム名だけでなく、データ型やNULL許可、キー情報なども一緒に取得できるのが特徴です。基本構文show columns from テーブル名;サンプルテーブルの作成まず、動作確認用に「DemoTable」というテーブルを作成します。mysql> create table DemoTable ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentFirstName varchar(