Stored Procedure ไม่ใช่แค่การรันคำสั่ง SQL แบบธรรมดาเท่านั้น แต่สามารถรองรับ “ตรรกะ” (Logic) ที่ซับซ้อนได้ไม่ต่างจากการเขียนโปรแกรม
บทความนี้เราจะทำความรู้จักกับการใช้ ตัวแปรภายใน, คำสั่งควบคุมเงื่อนไข (IF, CASE) และการวนลูป (LOOP, WHILE, REPEAT) เพื่อให้ Stored Procedure ของของเราฉลาดมากขึ้น
การประกาศและใช้งานตัวแปรภายใน Procedure
ภายใน Stored Procedure เราสามารถประกาศตัวแปรชั่วคราวเพื่อใช้เก็บข้อมูลคำนวณ หรือเปรียบเทียบค่าได้ด้วยคำสั่ง DECLARE
SQL
DECLARE variable_name datatype [DEFAULT value];- ใช้
SETหรือSELECT INTOเพื่อกำหนดค่าหรือดึงข้อมูลใส่ตัวแปร - ตัวแปรที่ประกาศจะใช้ได้เฉพาะภายใน Procedure เท่านั้น
การใช้ตัวแปรและ IF
SQL
DELIMITER //
CREATE PROCEDURE check_score(IN score INT)
BEGIN
DECLARE result VARCHAR(20);
IF score >= 80 THEN
SET result = 'ดีมาก';
ELSEIF score >= 50 THEN
SET result = 'พอใช้';
ELSE
SET result = 'ตก';
END IF;
SELECT result AS ผลการประเมิน;
END //
DELIMITER ;เรียกใช้งาน
SQL
CALL check_score(75);ผลลัพธ์
| ผลการประเมิน |
|---|
| พอใช้ |
การใช้คำสั่ง CASE แทน IF
CASE ใช้ในสถานการณ์ที่ต้องการเปรียบเทียบหลายกรณีที่ชัดเจน
CASE expression
WHEN value1 THEN ...
WHEN value2 THEN ...
ELSE ...
END CASE;
ตัวอย่างการใช้ CASE
SQL
DELIMITER //
CREATE PROCEDURE get_day_name(IN day_num INT)
BEGIN
DECLARE day_name VARCHAR(20);
CASE day_num
WHEN 1 THEN SET day_name = 'จันทร์';
WHEN 2 THEN SET day_name = 'อังคาร';
WHEN 3 THEN SET day_name = 'พุธ';
WHEN 4 THEN SET day_name = 'พฤหัส';
WHEN 5 THEN SET day_name = 'ศุกร์';
WHEN 6 THEN SET day_name = 'เสาร์';
WHEN 7 THEN SET day_name = 'อาทิตย์';
ELSE SET day_name = 'ไม่ถูกต้อง';
END CASE;
SELECT day_name AS วัน;
END //
DELIMITER ;เรียกใช้งาน
SQL
CALL get_day_name(6);ผลลัพธ์
| วัน |
|---|
| เสาร์ |
การวนลูปใน Stored Procedure
MySQL รองรับการวนลูปได้ 3 แบบ คือ
LOOPลูปแบบไม่มีเงื่อนไข ต้องใช้LEAVEเพื่อออกWHILEวนลูปขณะที่เงื่อนไขเป็นจริงREPEATวนลูปจนกว่าเงื่อนไขจะเป็นจริง
ตัวอย่างการใช้ WHILE วนเลข 1–5
SQL
DELIMITER //
CREATE PROCEDURE count_to_five()
BEGIN
DECLARE counter INT DEFAULT 1;
WHILE counter <= 5 DO
SELECT CONCAT('ลำดับที่ ', counter) AS หมายเลข;
SET counter = counter + 1;
END WHILE;
END //
DELIMITER ;เรียกใช้งาน
SQL
CALL count_to_five();ผลลัพธ์
| หมายเลข |
|---|
| ลำดับที่ 1 |
| ลำดับที่ 2 |
| ลำดับที่ 3 |
| ลำดับที่ 4 |
| ลำดับที่ 5 |
หมายเหตุ
- ตัวแปรที่ประกาศด้วย
DECLAREต้องประกาศไว้ตอนต้นของBEGIN ... ENDเท่านั้น - ห้ามใช้
SETกับตัวแปรที่ไม่ได้ประกาศไว้ภายใน Procedure - หากมีหลายลูปซ้อนกัน ควรตั้งชื่อ label เพื่อใช้
LEAVE label_name;ออกจากลูปที่ต้องการได้ชัดเจน