ตัวอย่างการใช้ User-defined Variables ร่วมกับ Prepared Statement เพื่อสร้าง Dynamic SQL
สร้างตารางตัวอย่าง
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(20),
LastName varchar(20) );
Query OK, 0 rows affected (0.53 sec)
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable(FirstName,LastName) values('John','Smith'); Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName,LastName) values('David','Miller'); Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(FirstName,LastName) values('John','Doe'); Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName,LastName) values('Chris','Brown'); Query OK, 1 row affected (0.15 sec)
แสดงข้อมูลทั้งหมด
mysql> select *from DemoTable;
+----+-----------+----------+ | Id | FirstName | LastName | +----+-----------+----------+ | 1 | John | Smith | | 2 | David | Miller | | 3 | John | Doe | | 4 | Chris | Brown | +----+-----------+----------+ 4 rows in set (0.00 sec)
ขั้นตอน Prepared Statement กับ Variable
mysql> set @yourTableName := 'DemoTable';
Query OK, 0 rows affected (0.00 sec)
mysql> set @query := CONCAT('select `LastName` from ', @yourTableName, ' where Id=3');
Query OK, 0 rows affected (0.00 sec)
mysql> prepare myStatement from @query;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute myStatement;
ผลลัพธ์:
+----------+ | LastName | +----------+ | Doe | +----------+ 1 row in set (0.00 sec)
ขั้นตอนสรุป
SET @var = value- กำหนดตัวแปรSET @sql = CONCAT(...)- สร้าง SQL String แบบ DynamicPREPARE stmt_name FROM @sql- Prepare StatementEXECUTE stmt_name [USING @param1, @param2, ...]- ExecuteDEALLOCATE PREPARE stmt_name- ปล่อย Statement (สำคัญ!)
ใช้กับ Parameter (?) แทน Concatenation
SET @sql = 'SELECT LastName FROM DemoTable WHERE Id = ?'; PREPARE stmt FROM @sql; SET @id = 3; EXECUTE stmt USING @id; DEALLOCATE PREPARE stmt;
ข้อดีของ Parameterized Query
- ป้องกัน SQL Injection
- Query Plan Cache ใช้ร่วมได้
- จัดการ Data Type อัตโนมัติ
ข้อจำกัด
- Prepared Statement เป็น Session-scoped
- ไม่รองรับทุก Statement Type (เช่น LOCK TABLES, SHOW, DESCRIBE)
- Variable ไม่สามารถใช้เป็น Identifier (Table/Column name) ใน Prepared Statement ได้ตรงๆ ต้อง CONCAT