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

MySQL: ปิดการแสดงผล Stored Procedure ด้วย Variable

การปิดกักผลลัพธ์ของ 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