Header Ads Widget

Giới thiệu về stored procedure trong MySQL (P.6) Vòng lặp trong Stored Procedures


Vòng lặp while

Cú pháp của vòng lặp while:

Mã:
WHILE expression DO
Statements
END WHILE
Đầu tiên, vòng lặp while kiểm tra biểu thức điều kiện, nếu điều kiện có giá trị true thì chương trình sẽ thực thi các lệnh trong vòng lặp. Vòng lặp while kiểm tra biểu thức trước khi thực thi các dòng lệnh. Dưới đây là 1 ví dụ về việc sử dụng vòng lặp while trong stored procedure:

Mã:
 DELIMITER $$
DROP PROCEDURE IF EXISTS WhileLoopProc$$
CREATE PROCEDURE WhileLoopProc()
    BEGIN
            DECLARE x  INT;
            DECLARE str  VARCHAR(255);
            SET x = 1;
            SET str =  '';
            WHILE x  <= 5 DO                           SET  str = CONCAT(str,x,',');                           SET  x = x + 1;               END WHILE;               SELECT str;       END$$   DELIMITER ;
Stored procedures trên tạo 1 chuỗi thông qua biến x cho đến khi x lớn hơn 5 và sau đó in chuỗi này ra màng hình bằng phát biểu select. 1 trong những lỗi mà lập trình viên hay mắc phải là biến x được dùng mà chưa được khởi tạo, giá trị của x lúc đó là NULL, vì vậy điều kiện lặp luôn luôn đúng, kết quả là đoạn mã bên trong vòng lặp while thực thi liên tục cho đến khi database của bạn bị crashed.

Vòng lặp repeat

Cú pháp của vòng lặp repeat:

Mã:
REPEAT
Statements;
UNTIL expression
END REPEAT
Dòng lệnh đầu tiên được thực thi, sau đó chương trình mới kiểm tra tới biểu thức logic. Nếu biểu thức logic có giá trị true, các dòng lệnh bên trong sẽ được lập lại liên tục cho đến khi biểu thức logic có giá trị false. Vì vòng lặp repeat kiểm tra biểu thức logic sau khi đã thực thi 1 lần dòng lệnh nên repeat được biết như vòng lặp tiền kiểm tra (post-test loop). Chúng ta có thể viết lại stored procedure trên bằng vòng lặp repeat như sau:

Mã:
 DELIMITER $$
DROP PROCEDURE IF EXISTS RepeatLoopProc$$
CREATE PROCEDURE RepeatLoopProc()
    BEGIN
            DECLARE x  INT;
            DECLARE str  VARCHAR(255);
            SET x = 1;
            SET str =  '';
            REPEAT
                        SET  str = CONCAT(str,x,',');
                        SET  x = x + 1;
            UNTIL x  > 5
            END REPEAT;
            SELECT str;
    END$$
DELIMITER ;
Chú ký không có delimiter (;) sau phát biểu UNTIL

Vòng lặp loop, leave và iterate

Phát biểu leave cho phép bạn rời vòng lặp. Nó gần giống với phát biểu break trong các ngôn ngữ khác như Java, C#...
Phát biểu Iterate cho phép bạn bắt đầu vòng lặp trở lại. Nó gần giống như phát biểu continue trong Java hay C#.
MySql cũng hỗ trợ vòng lặp loop cho phép bạn thực thi dòng lệnh lặp 1 cách cơ động. Một ví dụ về vòng lặp loop

Mã:
 DELIMITER $$
DROP PROCEDURE IF EXISTS LOOPLoopProc$$
CREATE PROCEDURE LOOPLoopProc()
    BEGIN
            DECLARE x  INT;
            DECLARE str  VARCHAR(255);
            SET x = 1;
            SET str =  '';
            loop_label:  LOOP
                        IF  x > 10 THEN
                                    LEAVE  loop_label;
                        END  IF;
                        SET  x = x + 1;
                        IF  (x mod 2) THEN
                                    ITERATE  loop_label;
                        ELSE
                                    SET  str = CONCAT(str,x,',');
                        END  IF;
                     
            END LOOP; 
            SELECT str;
    END$$
Store procedure trên tạo dựng 1 chuỗi với các số chẵn. Đầu tiên, ta định nghĩa một nhãn loop, nếu biến x lớn hơn 10 thì vòng lặp kết thúc thông qua phát biểu leave. Nếu x lẻ, iterate sẽ bỏ qua các dòng lệnh bên dưới nó và tiếp tục vòng lặp mới, ngược lại, block code trong phát biểu else sẽ thực thi để tạo chuỗi với các số chẵn.

Nhận xét