การปิดกักผลลัพธ์ของ Stored Procedure ไว้ใน Variable
MySQL Stored Procedure ตามปกติจะส่งผลลัพธ์ (Result Set) กลับมาทันที หากต้องการไม่ให้แสดงผลทันที แต่เก็บไว้ใน User Variable (@var) ให้ใช้ SET @var = (SELECT ...) ภายใน Procedure แล้วค่อย SELECT @var ตอนเรียกใช้
ตัวอย่างการใช้งาน
สร้างตารางและข้อมูล:
mysql> CREATE TABLE person_information (
-> Id INT, Name VARCHAR(20)
-> );
Query OK, 0 rows affected (0.50 sec)
mysql> INSERT INTO person_information VALUES(100,'John'),(101,'Chris'),(102,'Robert');
Query OK, 3 rows affected (0.15 sec)
สร้าง Procedure ที่เก็บผลลัพธ์ไว้ใน @output:
mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_suppressOutputDemo()
-> BEGIN
-> SET @output = (SELECT Name FROM person_information WHERE Id = 101);
-> END //
Query OK, 0 rows affected (0.14 sec)
mysql> DELIMITER ;
เรียก Procedure (ไม่แสดงผลอะไร):
mysql> CALL sp_suppressOutputDemo();
Query OK, 0 rows affected (0.00 sec)
ดึงค่าจาก Variable:
mysql> SELECT @output;
+---------+
| @output |
+---------+
| Chris |
+---------+
1 row in set (0.00 sec)
คำอธิบาย
DELIMITER //เปลี่ยน Delimiter ชั่วคราว เพื่อให้ ; ภายใน Procedure ไม่จบคำสั่งSET @output = (SELECT ...)กำหนดค่าให้ User Variable (Session-scoped)- Subquery ต้องคืนค่า Single Value (1 แถว 1 คอลัมน์) มิฉะนั้น Error
- หลัง CALL ค่า @output คงอยู่ใน Session จนกว่าจะ Set ใหม่หรือ Disconnect
กรณีต้องการ Return หลายค่า/หลายแถว
-- ใช้ OUT Parameter
CREATE PROCEDURE sp_get_info(OUT p_name VARCHAR(100), OUT p_count INT)
BEGIN
SELECT Name INTO p_name FROM person_information WHERE Id = 101;
SELECT COUNT(*) INTO p_count FROM person_information;
END;
-- เรียกใช้
CALL sp_get_info(@name, @cnt);
SELECT @name, @cnt;
OUT Parameter เหมาะสำหรับคืนค่าหลายตัวและ Type-safe กว่า User Variable