ในโลกของระบบฐานข้อมูลจริง ๆ Stored Procedure มักถูกใช้ในกรณีต่าง ๆ ดังต่อไปนี้
- ต้องจัดการข้อมูลหลายตารางพร้อมกัน
- ต้องทำงานแบบมีเงื่อนไขซับซ้อน
- ต้องลดความซ้ำซ้อนของคำสั่ง SQL
- ต้องทำงานซ้ำ ๆ เป็น routine เช่น ปิดยอดรายวัน
ในบทความนี้ผมจะยกตัวอย่างสถานการณ์จริงให้เห็นว่า Stored Procedure ช่วยให้งานเหล่านี้เป็นระบบและง่ายขึ้นได้อย่างไร มาดูกันครับ
ตัวอย่างการใช้งาน
ตัวอย่างที่ 1 สรุปยอดขายรายวัน
ระบบร้านค้าต้องการคำนวณยอดขายของแต่ละวัน แล้วเก็บเข้าอีกตารางเพื่อใช้ทำรายงาน
สมมติว่าเรามีตารางและข้อมูลดังต่อไปนี้
ตาราง sales
| sale_id | amount | sale_date |
|---|---|---|
| 1 | 100.00 | 2024-04-10 |
| 2 | 250.00 | 2024-04-10 |
| 3 | 80.00 | 2024-04-11 |
ตาราง daily_summary
| summary_date | total_sales |
|---|---|
| 2024-04-10 | 350.00 |
| 2024-04-11 | 80.00 |
สร้าง Stored Procedure
SQL
DELIMITER //
CREATE PROCEDURE summarize_daily_sales(IN summary_date DATE)
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(amount)
INTO total
FROM sales
WHERE sale_date = summary_date;
INSERT INTO daily_summary(summary_date, total_sales)
VALUES (summary_date, IFNULL(total, 0));
END //
DELIMITER ;เรียกใช้งาน
SQL
CALL summarize_daily_sales('2024-04-10');ตัวอย่างที่ 2 อัปเดตสถานะออเดอร์ และตัด stock พร้อมกัน
เมื่อมีการยืนยันออเดอร์ เราอาจต้องการทำงานดังต่อไปนี้
- เปลี่ยนสถานะออเดอร์
- ลดจำนวนสินค้าในคลัง
- เพิ่มข้อมูล log
สมมติว่าเรามีตาราง 2 ตารางคือ orders และ products
สร้าง Stored Procedure
SQL
DELIMITER //
CREATE PROCEDURE process_order(IN p_order_id INT, IN p_product_id INT, IN qty INT)
BEGIN
UPDATE orders
SET status = 'confirmed'
WHERE order_id = p_order_id;
UPDATE products
SET quantity = quantity - qty
WHERE product_id = p_product_id;
INSERT INTO order_logs(order_id, log_text, log_time)
VALUES (p_order_id, 'Order confirmed and stock updated', NOW());
END //
DELIMITER ;เรียกใช้งาน
SQL
CALL process_order(101, 201, 2);เห็นได้ว่า Stored Procedure สามารถนำไปใช้งานกับระบบจริงได้หลากหลาย ไม่ว่าจะเป็น
- การสรุปข้อมูลเพื่อทำรายงาน
- การจัดการข้อมูลหลายตารางแบบอัตโนมัติ
- การลดซ้ำซ้อนในการเขียน SQL
ทั้งหมดนี้จะช่วยให้ระบบของเราเป็นระเบียบ ปลอดภัย และง่ายต่อการดูแลในระยะยาว