สร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable1973 ( StudentId int, StudentName varchar(20) );
mysql> insert into DemoTable1973 values(101,'Chris'); mysql> insert into DemoTable1973 values(102,'John Doe'); mysql> insert into DemoTable1973 values(103,'David'); mysql> insert into DemoTable1973 values(104,'John Smith');
สร้าง Stored Procedure
รับพารามิเตอร์ 2 ตัว: ชื่อตารางใหม่ (newTableName) และคำค้นหา (tbl) ใช้ PREPARE และ EXECUTE สำหรับ Dynamic 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 //
mysql> DELIMITER ;
เรียกใช้ Procedure
mysql> call demo_create('newTableName','John'); Query OK, 2 rows affected (0.00 sec)
ผลลัพธ์ตารางใหม่
mysql> select * from newTableName;
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 102 | John Doe | | 104 | John Smith | +-----------+-------------+ 2 rows in set (0.00 sec)
ข้อสังเกตสำคัญ
- ใน
CONCATต้อง escape single quote ด้วยการเขียน''%''เพื่อให้ได้'%John%'ใน Query จริง DROP TABLE IF EXISTSป้องกัน Error ถ้าตารางมีอยู่แล้ว- วิธีนี้ใช้ได้กับ Dynamic SQL ทุกประเภท ไม่ได้จำกัดแค่ CREATE TABLE
รูปแบบปลอดภัยกว่า (Prepared Statement แบบ Parameterized)
SET @query = 'CREATE TABLE ? AS SELECT * FROM DemoTable1973 WHERE StudentName LIKE ?';
PREPARE ps FROM @query;
SET @tbl_name = 'newTableName', @pattern = CONCAT('%', 'John', '%');
EXECUTE ps USING @tbl_name, @pattern;
หมายเหตุ: MySQL ไม่รองรับ Parameter สำหรับ Identifier (ชื่อตาราง/คอลัมน์) ต้องใช้ CONCAT แบบเดิม