MySQL Stored Procedure คืออะไร และมีประโยชน์อย่างไร

ในการพัฒนาระบบฐานข้อมูลด้วย 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 ง่าย ๆ

SQL
DELIMITER //

CREATE PROCEDURE say_hello()
BEGIN
    SELECT 'Hello from Stored Procedure!';
END;
//

DELIMITER ;

จากนั้นเราสามารถเรียกใช้ด้วยคำสั่ง

SQL
CALL say_hello();

ผลลัพธ์จะได้เป็นข้อความจาก Procedure ที่เราสร้างไว้

ข้อควรระวังในการใช้งาน

  • อย่าลืมใช้ DELIMITER เพื่อบอก MySQL ว่า code block ของ Procedure เริ่ม/จบตรงไหน
  • Stored Procedure ไม่มีค่า return แบบฟังก์ชัน ให้ใช้ OUT หรือ SELECT แทน
  • ไม่ควรใส่ logic ซับซ้อนมากเกินไปใน Procedure เดียว ควรแยกเป็นหลาย Procedure เพื่อให้ดูแลรักษาง่าย
แชร์เรื่องนี้