Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

Dynamic SQL: รับพารามิเตอร์มาใช้ใน LIKE สำหรับสร้างตารางใหม่ใน Stored Procedure

สร้างตารางและข้อมูลตัวอย่าง

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 แบบเดิม