ในการพัฒนาระบบฐานข้อมูลด้วย MySQL เรามักจะเขียนคำสั่ง SQL ซ้ำ ๆ เช่น การดึงรายงานยอดขาย, การอัปเดตสถานะคำสั่งซื้อ หรือการจัดการข้อมูลหลายตารางพร้อมกัน
สิ่งเหล่านี้หากเขียนซ้ำทุกครั้งที่ต้องใช้งาน ก็จะทำให้โค้ดรก ดูแลยาก และเกิดข้อผิดพลาดได้ง่าย
ทางออกของปัญหานี้ก็คือการใช้ Stored Procedure
Stored Procedure คืออะไร?
Stored Procedure คือ ชุดคำสั่ง SQL ที่ถูกเก็บไว้ภายในฐานข้อมูล สามารถเรียกใช้งานได้หลายครั้งเหมือนเป็นฟังก์ชันสำเร็จรูป
เราสามารถใส่ logic ภายในได้ ไม่ว่าจะเป็นเงื่อนไข (IF, CASE), การวนลูป (LOOP, WHILE) หรือแม้แต่การจัดการกับข้อผิดพลาด
สรุปง่าย ๆ ก็คื มันเหมือน แมโคร หรือ สูตรสำเร็จ ที่เราสร้างไว้ แล้วสามารถเรียกใช้ได้ทุกครั้งที่ต้องการ โดยไม่ต้องเขียนซ้ำ
ทำไมต้องใช้ Stored Procedure?
การใช้ Stored Procedure มีข้อดีหลายอย่าง โดยเฉพาะเมื่อระบบของเราเริ่มใหญ่ขึ้น หรือทำงานร่วมกับระบบย่อยหลายระบบ
- ลดความซ้ำซ้อนของโค้ด – เขียนครั้งเดียว เรียกใช้ซ้ำได้ทุกที่
- ควบคุม logic ฝั่งเซิร์ฟเวอร์ – ลดภาระฝั่งแอปพลิเคชัน เช่น PHP หรือ Python
- เพิ่มความเร็วในการทำงาน – คำสั่ง SQL ภายใน Procedure จะถูกเตรียมไว้ (precompiled)
- ปลอดภัยกว่า – จำกัดสิทธิ์การเข้าถึงเฉพาะคำสั่งที่จำเป็น
- ดูแลรักษาง่าย – ถ้าต้องแก้ไข logic ก็แก้ที่ Procedure เดียว ไม่ต้องไล่เปลี่ยนทุกหน้า
ตัวอย่างสถานการณ์ที่ควรใช้ Stored Procedure
ลองนึกถึงระบบร้านค้าออนไลน์ ที่ต้องทำหลายอย่างพร้อมกัน เช่น เมื่อมีคำสั่งซื้อใหม่
- ต้องบันทึกข้อมูลคำสั่งซื้อ
- อัปเดตจำนวนสินค้าในสต๊อก
- คำนวณค่าจัดส่ง
- สร้างใบเสร็จ
- ส่งแจ้งเตือนไปยังลูกค้า
หากเราเขียนคำสั่ง SQL แยกกันทุกครั้งที่คำสั่งซื้อใหม่เข้ามา โอกาสที่ข้อมูลจะไม่ครบ หรือทำไม่ทัน ก็สูง
แต่ถ้าใช้ Stored Procedure เราสามารถเขียน logic เหล่านี้รวมไว้ใน Procedure เดียว แล้วแค่ CALL process_order(...) ก็เสร็จเรียบร้อย
เปรียบเทียบ Stored Procedure กับ SQL ธรรมดา
| หัวข้อ | SQL ธรรมดา | Stored Procedure |
|---|---|---|
| การใช้งานซ้ำ | คัดลอกวางใหม่ในแต่ละจุด | เรียกใช้ด้วย CALL ได้ทันที |
| การควบคุม logic | ทำได้ยาก | ใช้ IF, CASE, LOOP ได้เต็มที่ |
| ความปลอดภัย | เปิดเผย SQL ตรง ๆ | ควบคุมผ่านสิทธิ์ EXECUTE ได้ |
| ความเร็ว | ต้องคอมไพล์ทุกครั้ง | เตรียมไว้แล้ว (compiled) |
| ความยืดหยุ่น | ต่ำ | ปรับเปลี่ยนและต่อยอดได้ง่าย |
ตัวอย่าง Stored Procedure ง่าย ๆ
DELIMITER //
CREATE PROCEDURE say_hello()
BEGIN
SELECT 'Hello from Stored Procedure!';
END;
//
DELIMITER ;จากนั้นเราสามารถเรียกใช้ด้วยคำสั่ง
CALL say_hello();ผลลัพธ์จะได้เป็นข้อความจาก Procedure ที่เราสร้างไว้
ข้อควรระวังในการใช้งาน
- อย่าลืมใช้
DELIMITERเพื่อบอก MySQL ว่า code block ของ Procedure เริ่ม/จบตรงไหน - Stored Procedure ไม่มีค่า return แบบฟังก์ชัน ให้ใช้
OUTหรือSELECTแทน - ไม่ควรใส่ logic ซับซ้อนมากเกินไปใน Procedure เดียว ควรแยกเป็นหลาย Procedure เพื่อให้ดูแลรักษาง่าย