ใช้ PREPARE, EXECUTE ร่วมกับ User Variable (@var) เพื่อรับค่าจาก Prepared Statement ใน Stored Procedure
ตัวอย่าง: Stored Procedure สร้าง Prepared Statement คืนค่า
mysql> DELIMITER //
mysql> CREATE PROCEDURE return_value()
-> BEGIN
-> SET @returnQuery = 'SELECT 98 INTO @value';
-> PREPARE stmt FROM @returnQuery;
-> EXECUTE stmt;
-> END
-> //
Query OK, 0 rows affected (0.20 sec)
mysql> DELIMITER ;
เรียกใช้และดูผลลัพธ์
mysql> CALL return_value(); Query OK, 1 row affected (0.07 sec) mysql> SELECT @value;
ผลลัพธ์
+--------+ | @value | +--------+ | 98 | +--------+
ขั้นตอน Prepared Statement
PREPARE stmt FROM 'SQL string'- คอมไพล์คำสั่งEXECUTE stmt [USING @var1, @var2, ...]- รันคำสั่ง (ส่งพารามิเตอร์ได้)DEALLOCATE PREPARE stmt- ปล่อยหน่วยความจำ
ตัวอย่างเต็มรูปแบบ: มี Parameter
DELIMITER //
CREATE PROCEDURE get_user_by_id(IN uid INT, OUT uname VARCHAR(100))
BEGIN
SET @sql = 'SELECT Name INTO @out_name FROM users WHERE Id = ?';
PREPARE stmt FROM @sql;
SET @param = uid;
EXECUTE stmt USING @param;
DEALLOCATE PREPARE stmt;
SET uname = @out_name;
END //
DELIMITER ;
-- เรียกใช้
CALL get_user_by_id(1, @result);
SELECT @result;
ข้อควรระวัง
- Prepared Statement อยู่ใน Session scope
- ต้อง
DEALLOCATE PREPAREเพื่อไม่รั่ว Memory - User Variable (@var) ใช้ส่งค่าระหว่าง Prepared Statement และ Procedure