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

MySQL: เรียก Stored Procedure ด้วย CALL แล้วค่อย SELECT

การเรียก 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