MySQL การใช้ตัวแปร, คำสั่งควบคุม และการจัดการ Logic ภายใน Stored Procedure

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; ออกจากลูปที่ต้องการได้ชัดเจน
แชร์เรื่องนี้