กลับมาอีกครั้งกับคอนเทนต์สำหรับพื้นฐานการจัดการฐานข้อมูล โดยวันนี้เราจะมาอยู่กับอีกเรื่องที่ต้องรู้ที่จะทำให้เราสามารถใช้งานใช้ประโยชน์กับ Relational Database ได้ง่ายขึ้น
โดย Stored Procedure เป็นเหมือนเราเขียน SQL ดองไว้ แล้วตอนที่เราจะใช้คิวรีที่เขียนไว้เราก็จะเรียกใช้งาน โดยใช้คำสั่ง CALL ซึ่งความหมายตรงตัวมาก ทำแบบนี้ทำให้เราสามารถคิวรีได้สะดวกมาก ๆ ถึงแม้ตารางเราจะเยอะมาก คิวรีซับซ้อนสุด ๆ ทำให้หยุดปัญหาต้องมานั่งเขียนคิวรียาว ๆ ใหม่ในทุก ๆ รอบ
มันใช้ยังไง? 💻
ก่อนอื่นเราจะต้องมีฐานข้อมูลก่อน โดยในตัวอย่างนี้ผมใช้เป็น MySQL ยกตัวอย่างจากระบบ ERP แบบง่าย ๆ สมมติว่าเป็นบริษัทผลิตและขายสมาร์ทโฟนนะครับ หากเรามีฐานข้อมูลแล้ว ให้เราทำการสร้างตารางดังนี้
1. สร้างตารางที่จำเป็น
CREATE TABLE Products (
ProductID INT PRIMARY KEY IDENTITY(1,1),
ProductName NVARCHAR(100),
StockQuantity INT,
Price DECIMAL(10,2)
);
CREATE TABLE Orders (
OrderID INT PRIMARY KEY IDENTITY(1,1),
OrderDate DATETIME,
CustomerID INT,
TotalAmount DECIMAL(10,2)
);
CREATE TABLE OrderDetails (
OrderDetailID INT PRIMARY KEY IDENTITY(1,1),
OrderID INT,
ProductID INT,
Quantity INT,
UnitPrice DECIMAL(10,2)
);
2. เติมข้อมูลลงฐานข้อมูล
-- เพิ่มข้อมูลในตาราง Products
INSERT INTO Products (ProductName, StockQuantity, Price) VALUES
('สมาร์ทโฟน รุ่น A', 100, 9999.99),
('สมาร์ทโฟน รุ่น B', 150, 14999.99),
('สมาร์ทโฟน รุ่น C', 80, 19999.99),
('หูฟังไร้สาย', 200, 2999.99),
('แท่นชาร์จไร้สาย', 120, 1499.99);
-- เพิ่มข้อมูลในตาราง Orders
INSERT INTO Orders (OrderDate, CustomerID, TotalAmount) VALUES
(GETDATE(), 1, 9999.99),
(DATEADD(DAY, -1, GETDATE()), 2, 17999.98),
(DATEADD(DAY, -2, GETDATE()), 3, 23999.97);
-- เพิ่มข้อมูลในตาราง OrderDetails
INSERT INTO OrderDetails (OrderID, ProductID, Quantity, UnitPrice) VALUES
(1, 1, 1, 9999.99),
(2, 2, 1, 14999.99),
(2, 4, 1, 2999.99),
(3, 3, 1, 19999.99),
(3, 5, 2, 1499.99);
3. ใช้งาน Stored Procedure
ก่อนเริ่มใช้งานเราต้องรู้จัก Syntax ของมันก่อนนน โดยสำหรับการสร้าง PROCEDURE จะมีรูปแบบดังนี้
CREATE PROCEDURE ชื่อ_procedure()
BEGIN
-- คำสั่ง SQL ของเรา
END;
จากตารางที่เราสร้างกันมา เราสามารถสร้าง Stored Procedure เพื่อเพิ่มข้อมูลในตาราง Products ได้โดยเขียนแบบนี้
DELIMITER //
CREATE PROCEDURE AddProduct(
IN productName VARCHAR(255),
IN stockQuantity INT,
IN price DECIMAL(10,2)
)
BEGIN
INSERT INTO Products (ProductName, StockQuantity, Price) VALUES (productName, stockQuantity, price);
END //
DELIMITER ;
สร้างเสร็จเราก็จะต้องเรียกใช้งานใช่มั้ยครับ ตอนเรียกเราก็ CALL มาด้วยชื่อ Procedure แล้วถ้ามันต้องใส่ค่าพารามิเตอร์ เราก็ระบุเข้าไปได้เลย
CALL AddProduct('สมาร์ทโฟน รุ่น D', 50, 12999.99);
ตัวอย่างการเพิ่มเข้าไปแล้วเรามาดูตัวอย่างของการแก้ไขและลบ Stored Procedure กันต่อ โดยสำหรับการแก้ไข Stored Procedure เราจะต้องลบของเก่าก่อนแล้วค่อยสร้างของใหม่นะครับ
DROP PROCEDURE IF EXISTS AddProduct;
CREATE PROCEDURE AddProduct(
IN productName VARCHAR(255),
IN stockQuantity INT,
IN price DECIMAL(10,2)
)
BEGIN
-- คำสั่ง SQL ใหม่ของคุณ
END;
จากคำสั่งด้านบนจะเห็นว่าตอนที่เราลบ Stored Procedure เราสามารถใช้คำสั่ง DROP ได้เลย
DROP PROCEDURE IF EXISTS AddProduct;
แล้วไหนที่บอกว่าเอาไว้ลดการคิวรีซ้ำ ๆ ล่ะ? สำหรับการคิวรีเราก็ทำเหมือนเดิมเลยคือ สร้าง PROCEDURE ใส่ SQL คิวรีของเราไปในระหว่าง BEGIN กับ END
DELIMITER //
CREATE PROCEDURE GetProducts()
BEGIN
SELECT * FROM Products;
END //
DELIMITER ;
ตอนเรียกใช้ก็ค่อย CALL มาแบบนี้
CALL GetProducts();
ก่อนจะจบไปหลายคนคงสงสัยใช่มั้ยครับว่า DELIMITER คืออิหยัง? โดยใน MySQL เราจะใช้มันเป็นตัวแบ่งคำสั่งเพื่อบอกว่าจบคำสั่ง SQL แล้วนะ คล้าย ๆ กับ เซมิโคลอน (;) เลย แต่เมื่อเราสร้าง Stored Procedure หรือ Trigger ที่มีหลายคำสั่ง เราจะใช้ DELIMITER เพื่อเปลี่ยนตัวแบ่งชั่วคราว เพื่อไม่ให้ MySQL สับสนกับเครื่องหมายเซมิโคลอนที่อยู่ภายใน Stored Procedure นั่นเอง
ทั้งหมดนี้ก็จะเป็นตัวอย่างง่าย ๆ สำหรับการใช้งาน Stored Procedure แอดหวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนนะคร้าบบบ 💗