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

การใช้ตัวแปรผู้ใช้ (User-defined Variable) กับ Prepared Statement ใน MySQL

สามารถใช้ 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)

คำอธิบายขั้นตอน

  1. SET @tableName = 'DemoTable' - กำหนดตัวแปรชื่อตาราง
  2. SET @query := CONCAT(...) - สร้างคิวรี่แบบ Dynamic
  3. PREPARE stmt FROM @query - Compile/Prepare คิวรี่
  4. EXECUTE stmt - รันคิวรี่ที่ Prepare ไว้
  5. 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