Stored Procedure Control Flow: IF-THEN-END IF
MySQL Stored Procedure รองรับ IF ... THEN ... END IF สำหรับ Conditional Logic ภายใน Procedure
Syntax
IF condition THEN
statements;
END IF;
-- หรือ IF-ELSE
IF condition THEN
statements;
ELSE
statements;
END IF;
-- หรือ IF-ELSEIF-ELSE
IF condition1 THEN
statements;
ELSEIF condition2 THEN
statements;
ELSE
statements;
END IF;
ตัวอย่าง: Procedure รับ Argument แล้ว Insert หรือ Select
CREATE TABLE DemoTable643 (ClientId INT);
INSERT INTO DemoTable643 VALUES (1000);
DELIMITER //
CREATE PROCEDURE IF_DEMO(IN argument INT)
BEGIN
DECLARE firstArgument INT DEFAULT 0;
DECLARE secondArgument INT DEFAULT 1;
IF firstArgument = argument THEN
INSERT INTO DemoTable643 VALUES (2000);
END IF;
IF secondArgument = argument THEN
SELECT * FROM DemoTable643;
END IF;
END //
DELIMITER ;
การทดสอบ
-- เรียกด้วย 0: Insert 2000 (ไม่ Select)
CALL IF_DEMO(0);
-- เรียกด้วย 1: Select ทั้งหมด (มี 1000 และ 2000)
CALL IF_DEMO(1);
ผลลัพธ์ CALL IF_DEMO(1):
+----------+
| ClientId |
+----------+
| 1000 |
| 2000 |
+----------+
ตัวอย่าง Advance: IF-ELSEIF-ELSE
CREATE PROCEDURE grade_student(IN score INT, OUT grade VARCHAR(2))
BEGIN
IF score >= 90 THEN
SET grade = 'A';
ELSEIF score >= 80 THEN
SET grade = 'B';
ELSEIF score >= 70 THEN
SET grade = 'C';
ELSEIF score >= 60 THEN
SET grade = 'D';
ELSE
SET grade = 'F';
END IF;
END;
CASE Statement ใน Stored Procedure (Alternative)
CASE
WHEN score >= 90 THEN SET grade = 'A';
WHEN score >= 80 THEN SET grade = 'B';
WHEN score >= 70 THEN SET grade = 'C';
WHEN score >= 60 THEN SET grade = 'D';
ELSE SET grade = 'F';
END CASE;
⚠️ ข้อควรระวัง
- END IF ต้องมี Semicolon (;) - ไม่อยู่ใน END IF
- DECLARE ต้องอยู่ต้น BEGIN Block - ก่อน Statement อื่นๆ
- Nesting Level: MySQL จำกัด Nesting (ประมาณ 255 Levels)
- Performance: Logic ซับซ้อนใน SP ควรย้ายไป Application Layer
Debug Stored Procedure
-- ดู Warnings
SHOW WARNINGS;
-- Debug Print (MySQL ไม่มี PRINT ใช้ SELECT)
SELECT 'Debug: Entered IF block' AS msg;