สามารถใช้ User-defined Variable (ขึ้นต้นด้วย @) เพื่อเก็บชื่อตารางหรือคิวรี่ แล้วนำไปใช้กับ Prepared Statement
สร้างตารางตัวอย่าง
mysql> create table DemoTable (
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName varchar(20) );
Query OK, 0 rows affected (0.71 sec)
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable(StudentName) values('Chris'); Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(StudentName) values('David'); Query OK, 1 row affected (0.06 sec)
mysql> insert into DemoTable(StudentName) values('Sam'); Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName) values('Mike'); Query OK, 1 row affected (0.12 sec)
แสดงข้อมูลทั้งหมด
mysql> select * from DemoTable;
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Chris | | 2 | David | | 3 | Sam | | 4 | Mike | +-----------+-------------+ 4 rows in set (0.00 sec)
ใช้ Variable กับ Prepared Statement
mysql> set @tableName = 'DemoTable';
Query OK, 0 rows affected (0.04 sec)
mysql> set @queryToSelectStudentName := concat('select StudentName from ',@tableName);
Query OK, 0 rows affected (0.28 sec)
mysql> prepare executeQuery from @queryToSelectStudentName;
Query OK, 0 rows affected (0.04 sec)
Statement prepared
mysql> execute executeQuery;
ผลลัพธ์:
+-------------+ | StudentName | +-------------+ | Chris | | David | | Sam | | Mike | +-------------+ 4 rows in set (0.00 sec)
คำอธิบายขั้นตอน
SET @tableName = 'DemoTable'- กำหนดตัวแปรชื่อตารางSET @query := CONCAT(...)- สร้างคิวรี่แบบ DynamicPREPARE stmt FROM @query- Compile/Prepare คิวรี่EXECUTE stmt- รันคิวรี่ที่ Prepare ไว้DEALLOCATE PREPARE stmt- ปล่อย Prepared Statement (สำคัญ!)
ใช้กับ Parameter (Placeholder ?)
SET @sql = 'SELECT * FROM DemoTable WHERE StudentId = ?'; PREPARE stmt FROM @sql; SET @id = 2; EXECUTE stmt USING @id; DEALLOCATE PREPARE stmt;
ข้อจำกัด
- ตัวแปร @variable เป็น Session-scoped (หายเมื่อปิด Connection)
- Prepared Statement ไม่รองรับบางคำสั่ง (เช่น LOCK TABLES, PREPARE ซ้อน)
- ไม่สามารถใช้ Variable สำหรับ Identifier (Table/Column name) ใน Prepared Statement ตรงๆ ต้อง用 CONCAT สร้าง SQL String
กรณีใช้งานจริง
Dynamic SQL ใน Stored Procedure, Reporting tools, ORM frameworks