Trong Stored Procedure của MySQL, câu lệnh IF ... THEN ... ELSE ... END IF cho phép thực thi logic phân nhánh dựa trên điều kiện. Đây là cấu trúc điều khiển luồng cơ bản để viết logic nghiệp vụ phức tạp bên trong database.
Cú pháp IF...ELSE
IF condition THEN
statement_list1;
ELSE
statement_list2;
END IF;
Có thể mở rộng thành IF ... THEN ... ELSEIF ... THEN ... ELSE ... END IF cho nhiều nhánh.
Ví dụ minh họa: Procedure nhận tham số và so sánh với 10
Tạo procedure:
mysql> DELIMITER //
mysql> CREATE PROCEDURE IF_ELSE_DEMO(IN value INT)
BEGIN
SET @val = value;
IF @val > 10 THEN
SELECT CONCAT(@val, ' is greater than 10');
ELSE
SELECT CONCAT(@val, ' is less than 10 ');
END IF;
END //
Query OK, 0 rows affected (0.16 sec)
mysql> DELIMITER ;
Gọi procedure với tham số 18
mysql> CALL IF_ELSE_DEMO(18);
Kết quả:
+------------------------------------+ | concat(@val,' is greater than 10') | +------------------------------------+ | 18 is greater than 10 | +------------------------------------+
Gọi procedure với tham số 5
mysql> CALL IF_ELSE_DEMO(5);
+-----------------------------------+ | concat(@val,' is less than 10 ') | +-----------------------------------+ | 5 is less than 10 | +-----------------------------------+
Các cấu trúc điều khiển khác trong MySQL Procedure
| Cấu trúc | Mô tả |
|---|---|
CASE WHEN ... THEN ... ELSE ... END CASE | Đa nhánh, tương tự switch-case |
WHILE condition DO ... END WHILE | Vòng lặp có điều kiện trước |
REPEAT ... UNTIL condition END REPEAT | Vòng lặp có điều kiện sau (chạy ít nhất 1 lần) |
LOOP ... END LOOP | Vòng lặp vô tận, thoát bằng LEAVE |
ITERATE label | Bỏ qua đến lần lặp tiếp theo (như continue) |
LEAVE label | Thoát khỏi vòng lặp/khối (như break) |
Ví dụ CASE WHEN
CREATE PROCEDURE grade_student(IN score INT)
BEGIN
CASE
WHEN score >= 90 THEN SELECT 'A';
WHEN score >= 80 THEN SELECT 'B';
WHEN score >= 70 THEN SELECT 'C';
WHEN score >= 60 THEN SELECT 'D';
ELSE SELECT 'F';
END CASE;
END;
Lưu ý
- Mọi câu lệnh trong procedure phải kết thúc bằng
;. - Biến cục bộ khai báo bằng
DECLARE var_name TYPE [DEFAULT value];ở đầuBEGIN. - Biến người dùng (
@var) không cần DECLARE, tồn tại suốt session. DELIMITERbắt buộc khi tạo procedure chứa nhiều câu lệnh.