Feb 2, 2010

10:00 PM - No comments

Giới thiệu về stored procedure trong MySQL (P.6)

Vòng lặp trong Stored Procedures

Ngôn ngữ lập trình MySQl stored hỗ trợ phát biểu vòng lặp cho phép bạn thực hiện các lệnh lặp. Các kiểu vòng lặp được mô tả lần lượt dưới đây:

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.
___________

0 comments:

Post a Comment