การเรียก Stored Procedure ใน MySQL: ใช้ CALL ไม่ใช่ SELECT FROM
MySQL ไม่รองรับ SELECT * FROM procedure_name() (ต่างจาก SQL Server/PostgreSQL) ต้องใช้ CALL procedure_name() แล้วค่อยรัน SELECT แยกต่างหากเพื่อดูผลลัพธ์
ตัวอย่างการใช้งาน
สร้างตารางและ Stored Procedure INSERT:
mysql> CREATE TABLE DemoTable2 (
-> CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CustomerName VARCHAR(100),
-> ShippingDateTime DATETIME
-> );
Query OK, 0 rows affected (0.66 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE insert_information(IN Name VARCHAR(100), IN shippingtime DATETIME)
-> BEGIN
-> INSERT INTO DemoTable2(CustomerName, ShippingDateTime) VALUES(Name, shippingtime);
-> END //
Query OK, 0 rows affected (0.16 sec)
mysql> DELIMITER ;
เรียก Procedure ด้วย CALL:
mysql> CALL insert_information('Chris', NOW());
Query OK, 1 row affected, 1 warning (0.15 sec)
ดูผลลัพธ์ด้วย SELECT แยกต่างหาก:
mysql> SELECT * FROM DemoTable2;
+------------+--------------+---------------------+
| CustomerId | CustomerName | ShippingDateTime |
+------------+--------------+---------------------+
| 1 | Chris | 2019-04-08 15:03:07 |
+------------+--------------+---------------------+
1 row in set (0.00 sec)
คำอธิบาย
CALLใช้สำหรับ Procedure ที่ไม่ Return Result Set โดยตรง (แต่อาจมี OUT Parameter)- Procedure ที่มี
SELECTภายใน จะส่ง Result Set กลับมาได้ (แต่ไม่ใช่ FROM clause) NOW()ใน Parameter → Warning เพราะคอลัมน์เป็น DATETIME ไม่ใช่ TIMESTAMP (Truncation)
รูปแบบ Procedure ที่คืนค่า (OUT Parameter)
DELIMITER //
CREATE PROCEDURE get_customer_count(OUT total INT)
BEGIN
SELECT COUNT(*) INTO total FROM DemoTable2;
END //
DELIMITER ;
CALL get_customer_count(@cnt);
SELECT @cnt;
MySQL 8.0+: Function (RETURN ค่าเดียว)
CREATE FUNCTION get_customer_count() RETURNS INT
READS SQL DATA
RETURN (SELECT COUNT(*) FROM DemoTable2);
-- ใช้ใน SELECT ได้เลย
SELECT get_customer_count();
Function ใช้ใน SELECT/WHERE ได้ ส่วน Procedure ต้อง CALL