การใช้งาน Stored Procedure เบื้องต้น
ในบทเรียนนี้ เราจะมาเรียนรู้เกี่ยวกับ Stored Procedure ใน MySQL ซึ่งเป็นเครื่องมือสำคัญในการจัดการฐานข้อมูลที่มีประสิทธิภาพและช่วยให้โค้ดของเราเป็นระเบียบมากยิ่งขึ้น Stored Procedure คือชุดคำสั่ง SQL ที่ถูกจัดเก็บไว้ในฐานข้อมูล ทำให้เราสามารถเรียกใช้งานชุดคำสั่งเหล่านี้ได้ง่ายๆ เพียงแค่เรียกชื่อ Stored Procedure แทนที่จะต้องเขียนชุดคำสั่ง SQL ซ้ำๆ ทุกครั้ง
Stored Procedure คืออะไร?
Stored Procedure เปรียบเสมือนฟังก์ชันหรือ subroutine ในภาษาโปรแกรมอื่นๆ เป็นกลุ่มของคำสั่ง SQL ที่ถูกคอมไพล์และจัดเก็บไว้ในฐานข้อมูล เมื่อเราเรียกใช้ Stored Procedure MySQL จะทำการ execute ชุดคำสั่งที่ถูกจัดเก็บไว้ ทำให้การทำงานรวดเร็วและมีประสิทธิภาพมากกว่าการส่งชุดคำสั่ง SQL ไปยัง Server ทุกครั้ง
ข้อดีของการใช้ Stored Procedure:
- Reuseability: สามารถเรียกใช้งานชุดคำสั่ง SQL เดิมได้หลายครั้ง โดยไม่ต้องเขียนโค้ดซ้ำ
- Security: สามารถกำหนดสิทธิ์การเข้าถึง Stored Procedure ได้ ทำให้ควบคุมการเข้าถึงข้อมูลได้ดีขึ้น
- Performance: Stored Procedure ถูกคอมไพล์และจัดเก็บไว้ใน Server ทำให้การทำงานรวดเร็วกว่าการส่ง SQL statements ทีละชุด
- Maintainability: การแก้ไขชุดคำสั่ง SQL ทำได้ง่าย เพียงแค่แก้ไข Stored Procedure ที่เดียว
ข้อเสียของการใช้ Stored Procedure:
- Debugging: การ Debug Stored Procedure อาจทำได้ยากกว่าการ Debug SQL statements ธรรมดา
- Portability: Stored Procedure อาจแตกต่างกันไปในแต่ละ Database Management System (DBMS) ทำให้การย้ายฐานข้อมูลอาจต้องปรับแก้ Stored Procedure
CREATE PROCEDURE
คำสั่ง CREATE PROCEDURE ใช้เพื่อสร้าง Stored Procedure ใน MySQL รูปแบบคำสั่งพื้นฐานคือ:
CREATE PROCEDURE procedure_name (
[IN | OUT | INOUT] parameter_name data_type[,...]
)
BEGIN
-- SQL statement(s)
END;
คำอธิบาย:
procedure_name: ชื่อของ Stored Procedureparameter_name: ชื่อของ parameter ที่ Stored Procedure รับ (optional)data_type: ชนิดข้อมูลของ parameter (เช่น INT, VARCHAR, DATE)IN: parameter ที่ส่งค่าเข้าไปใน Stored Procedure (ค่าเริ่มต้น)OUT: parameter ที่ส่งค่าออกจาก Stored ProcedureINOUT: parameter ที่ส่งค่าเข้าไปและออกจาก Stored ProcedureBEGIN ... END: บล็อกที่เก็บชุดคำสั่ง SQL
ตัวอย่าง:
สมมติว่าเราต้องการสร้าง Stored Procedure ที่รับค่า id ของลูกค้าและแสดงข้อมูลของลูกค้าคนนั้น
DELIMITER // -- เปลี่ยน delimiter ชั่วคราว
CREATE PROCEDURE GetCustomerById (
IN customer_id INT
)
BEGIN
SELECT * FROM Customers WHERE id = customer_id;
END //
DELIMITER ; -- คืนค่า delimiter เดิม
คำอธิบาย:
DELIMITER //และDELIMITER ;ใช้เพื่อเปลี่ยน delimiter ชั่วคราว เนื่องจาก Stored Procedure มี;อยู่ภายใน ทำให้ MySQL เข้าใจผิดว่าคำสั่งสิ้นสุดก่อนเวลาอันควร การเปลี่ยน delimiter เป็น//(หรืออย่างอื่นที่ไม่ใช่;) ช่วยให้ MySQL เข้าใจว่า Stored Procedure ยังไม่สิ้นสุดจนกว่าจะเจอ//GetCustomerByIdคือชื่อของ Stored ProcedureIN customer_id INTคือ parameter ที่รับค่า id ของลูกค้าเข้ามาSELECT * FROM Customers WHERE id = customer_id;คือ SQL statement ที่ดึงข้อมูลลูกค้าจากตารางCustomersโดยใช้customer_idเป็นเงื่อนไข
เหตุผลเชิงออกแบบ: การใช้ parameter IN ทำให้ Stored Procedure สามารถรับค่าจากภายนอกได้ ซึ่งทำให้มีความยืดหยุ่นและสามารถนำไปใช้กับลูกค้าคนอื่นๆ ได้
CALL
คำสั่ง CALL ใช้เพื่อเรียกใช้งาน Stored Procedure รูปแบบคำสั่งคือ:
CALL procedure_name(argument_list);
คำอธิบาย:
procedure_name: ชื่อของ Stored Procedure ที่ต้องการเรียกใช้งานargument_list: ค่าที่ส่งให้กับ parameter ของ Stored Procedure (ถ้ามี)
ตัวอย่าง:
หากต้องการเรียกใช้งาน Stored Procedure GetCustomerById ที่เราสร้างไว้ก่อนหน้านี้ โดยส่งค่า 1 เป็น customer_id:
CALL GetCustomerById(1);
คำสั่งนี้จะแสดงข้อมูลของลูกค้าที่มี id เท่ากับ 1 จากตาราง Customers
ตัวอย่างการใช้ OUT parameter:
สมมติว่าเราต้องการสร้าง Stored Procedure ที่นับจำนวนลูกค้าทั้งหมดในตาราง Customers และส่งค่ากลับมา
DELIMITER //
CREATE PROCEDURE GetTotalCustomers (
OUT total INT
)
BEGIN
SELECT COUNT(*) INTO total FROM Customers;
END //
DELIMITER ;
คำอธิบาย:
OUT total INTคือ parameter ที่ใช้ส่งค่าจำนวนลูกค้ากลับออกมาSELECT COUNT(*) INTO total FROM Customers;คือ SQL statement ที่นับจำนวนลูกค้าและเก็บค่าไว้ใน parametertotal
ในการเรียกใช้งาน Stored Procedure นี้ เราจะต้องประกาศตัวแปรเพื่อรับค่าที่ส่งออกมา:
SET @total_customers = 0; -- ประกาศตัวแปร
CALL GetTotalCustomers(@total_customers); -- เรียกใช้ Stored Procedure
SELECT @total_customers; -- แสดงค่า
คำอธิบาย:
SET @total_customers = 0;ประกาศตัวแปร@total_customersเพื่อเก็บค่าที่ส่งออกมาจาก Stored ProcedureCALL GetTotalCustomers(@total_customers);เรียกใช้ Stored Procedure และส่งตัวแปร@total_customersไปให้SELECT @total_customers;แสดงค่าที่อยู่ในตัวแปร@total_customersซึ่งเป็นจำนวนลูกค้าทั้งหมด
เหตุผลเชิงออกแบบ: การใช้ OUT parameter ช่วยให้ Stored Procedure สามารถส่งค่ากลับออกมาได้ ทำให้สามารถใช้ Stored Procedure ในการคำนวณหรือประมวลผลข้อมูลต่างๆ และส่งผลลัพธ์กลับมาใช้งานต่อได้
การนำ Code กลับมาใช้ซ้ำ
Stored Procedure ช่วยให้เราสามารถนำโค้ด SQL กลับมาใช้ซ้ำได้ง่าย โดยการสร้าง Stored Procedure ที่ทำหน้าที่เฉพาะอย่าง แล้วเรียกใช้งาน Stored Procedure นั้นจากที่ต่างๆ ในโปรแกรมของเรา
ตัวอย่าง:
สมมติว่าเรามีฟังก์ชันที่ต้องใช้บ่อยๆ คือการตรวจสอบว่าลูกค้ามี Order หรือไม่ เราสามารถสร้าง Stored Procedure เพื่อทำหน้าที่นี้ได้:
DELIMITER //
CREATE PROCEDURE CustomerHasOrders (
IN customer_id INT,
OUT has_orders BOOLEAN
)
BEGIN
SELECT COUNT(*) > 0 INTO has_orders FROM Orders WHERE customer_id = customer_id;
END //
DELIMITER ;
จากนั้นเราสามารถเรียกใช้งาน Stored Procedure นี้จากที่ต่างๆ ในโปรแกรมของเรา:
SET @customer_id = 1;
SET @has_orders = FALSE;
CALL CustomerHasOrders(@customer_id, @has_orders);
IF @has_orders THEN
SELECT 'Customer has orders';
ELSE
SELECT 'Customer has no orders';
END IF;
เหตุผลเชิงออกแบบ: การสร้าง Stored Procedure เพื่อทำหน้าที่เฉพาะอย่าง ทำให้โค้ดของเราเป็น modular มากขึ้น และง่ายต่อการบำรุงรักษา หากมีการเปลี่ยนแปลงในฟังก์ชันการตรวจสอบว่าลูกค้ามี Order หรือไม่ เราก็เพียงแค่แก้ไข Stored Procedure ที่เดียว แทนที่จะต้องแก้ไขโค้ดในหลายๆ ที่
แนวปฏิบัติที่ดี:
- ตั้งชื่อ Stored Procedure ให้สื่อความหมาย
- เขียน comment อธิบายการทำงานของ Stored Procedure
- ใช้ parameter ที่มีชื่อสื่อความหมาย
- หลีกเลี่ยงการใช้
SELECT *ใน Stored Procedure หากไม่จำเป็น - จัดการ error ใน Stored Procedure อย่างเหมาะสม
สรุป: Stored Procedure เป็นเครื่องมือที่มีประโยชน์ในการจัดการฐานข้อมูล MySQL ช่วยให้เราสามารถนำโค้ดกลับมาใช้ซ้ำ ปรับปรุงประสิทธิภาพ และเพิ่มความปลอดภัยให้กับโปรแกรมของเรา การเรียนรู้และใช้งาน Stored Procedure เป็นสิ่งสำคัญสำหรับนักพัฒนาที่ต้องการสร้างระบบฐานข้อมูลที่มีประสิทธิภาพและบำรุงรักษาง่าย