Trong phần này, chúng tôi kiểm tra các câu lệnh mà ngôn ngữ chương trình được lưu trữ MySQL cung cấp cho các lệnh xử lý lặp đi lặp lại [lặp đi lặp lại]. Có nhiều lý do tại sao một chương trình có thể cần lặp lại
Một chương trình hỗ trợ giao diện người dùng có thể chạy một vòng lặp chính để chờ và sau đó xử lý các lần nhấn phím của người dùng [tuy nhiên, điều này không áp dụng cho các chương trình được lưu trữ]
Nhiều thuật toán toán học chỉ có thể được thực hiện bằng các vòng lặp trong chương trình máy tính
Khi xử lý một tệp, một chương trình có thể lặp qua từng bản ghi trong tệp và thực hiện các phép tính
Một chương trình cơ sở dữ liệu có thể lặp qua các hàng được trả về bởi câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
3
Khá rõ ràng rằng đây là trường hợp cuối cùng—việc xử lý các hàng được trả về bởi câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;3—sẽ là lý do phổ biến nhất để lặp vòng lặp trong các chương trình được lưu trữ trong MySQL và chúng tôi sẽ xem xét chủ đề này rất nhiều trong Chương 5. Trong chương này, chúng ta xem xét các lệnh lặp ở dạng tổng quát
Cấu trúc lặp đơn giản nhất có thể là câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5. Cú pháp của câu lệnh này như sau
[label
:] LOOPstatements
END LOOP [label
];
Các câu lệnh giữa câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5 và câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;7 sẽ được lặp lại vô thời hạn, cho đến khi câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5 kết thúc. Bạn có thể chấm dứt
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5 bằng cách sử dụng câu lệnh
LEAVE label;0 mà chúng tôi sẽ mô tả ngay sau đây
Bạn có thể cung cấp nhãn cho vòng lặp, có cùng cú pháp với cú pháp mà chúng ta có thể thêm vào khối
LEAVE label;1. Nhãn có thể giúp bạn xác định câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;7 tương ứng với câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5 cụ thể. Quan trọng không kém, các nhãn có thể được sử dụng để kiểm soát luồng thực thi, như chúng ta sẽ thấy trong các phần tiếp theo
Ví dụ 4-19 cho thấy một vòng lặp rất đơn giản [và rất nguy hiểm]. Nó sẽ tiếp tục mãi mãi, hoặc ít nhất là cho đến khi bạn xoay sở để chấm dứt nó bằng cách nào đó. Vì các chương trình được lưu trữ chạy bên trong máy chủ cơ sở dữ liệu nên việc sử dụng Ctrl-C hoặc các hình thức ngắt bàn phím khác sẽ không hiệu quả—bạn sẽ chỉ có thể chấm dứt vòng lặp này bằng cách đưa ra lệnh
LEAVE label;4 đối với phiên MySQL hoặc bằng cách tắt máy chủ cơ sở dữ liệu. Trong thời gian chờ đợi, vòng lặp sẽ tiêu thụ nhiều CPU nhất có thể, vì vậy chúng tôi khuyên bạn không nên chạy ví dụ này trên các hệ thống sản xuất quan trọng của mình
Ví dụ 4-19. Vòng lặp vô hạn [đừng thử ở nhà. ]
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
Rõ ràng là chúng ta hầu như không bao giờ muốn lập trình một vòng lặp vô hạn, và do đó chúng ta cần một số cách để kết thúc vòng lặp. Chúng ta có thể làm điều này với câu lệnh
LEAVE label;0, vì vậy hãy chuyển sang câu lệnh này ngay lập tức
Câu lệnh
LEAVE label;0 cho phép chúng ta kết thúc một vòng lặp. Cú pháp chung cho câu lệnh
LEAVE label;0 là________số 8
LEAVE label;0 khiến vòng lặp hiện tại bị chấm dứt. Nhãn phù hợp với vòng lặp sẽ bị kết thúc, vì vậy nếu một vòng lặp được đặt trong một vòng lặp khác, chúng ta có thể thoát ra khỏi cả hai vòng lặp bằng một câu lệnh
Trong trường hợp đơn giản nhất, chúng ta chỉ thực hiện lệnh
LEAVE label;0 khi đã sẵn sàng thoát khỏi
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5, như trong Ví dụ 4-20
Ví dụ 4-20. Sử dụng LEAVE để kết thúc một vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;1
LEAVE label;0 có thể được sử dụng để thoát khỏi bất kỳ cấu trúc vòng lặp thay thế nào, như chúng ta sẽ xem xét trong các phần sắp tới. Trên thực tế, bạn cũng có thể sử dụng
LEAVE label;0 nếu bạn muốn thoát ra khỏi khối có tên là
LEAVE label;1 [được giới thiệu trước đó trong chương này]
Câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14 được sử dụng để khởi động lại quá trình thực thi ở đầu vòng lặp mà không thực hiện bất kỳ câu lệnh nào còn lại trong vòng lặp.
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14 có cú pháp như sau
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;7
Khi MySQL gặp câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14, nó sẽ bắt đầu thực thi khi bắt đầu vòng lặp được chỉ định. Trong ví dụ 4-21, chúng tôi in tất cả các số lẻ nhỏ hơn 10.
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14 được sử dụng để lặp lại vòng lặp nếu số chúng ta có không phải là số lẻ.
LEAVE label;0 được sử dụng để kết thúc vòng lặp khi chúng tôi đạt đến 10
Ví dụ 4-21. Sử dụng ITERATE để quay lại điểm bắt đầu của một vòng lặp
[1label
:] LOOPstatements
END LOOP [label
];
Mặc dù vòng lặp này rất hữu ích để minh họa việc sử dụng
LEAVE label;0 và
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14 để điều khiển một vòng lặp, nhưng nó là một thuật toán được xây dựng khá kém. Chúng ta có thể dễ dàng giảm một nửa số lần lặp lại vòng lặp bằng cách tăng biến vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;71 lên hai thay vì một
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14 khiến việc thực thi vòng lặp khởi động lại ở đầu vòng lặp. Nếu bạn đang sử dụng vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 [xem phần tiếp theo], điều này có nghĩa là vòng lặp sẽ thực hiện lại vô điều kiện, bỏ qua điều kiện
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;74 mà nếu không sẽ kết thúc vòng lặp. Điều này có thể dẫn đến hành vi không mong muốn. Trong vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;75,
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14 sẽ dẫn đến điều kiện
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;75 được đánh giá lại trước lần lặp tiếp theo của vòng lặp
Chúng ta có thể xây dựng bất kỳ dạng vòng lặp nào có thể tưởng tượng được bằng cách sử dụng các câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5,
LEAVE label;0 và
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;14. Tuy nhiên, trên thực tế, các vòng lặp “thủ công” này rất khó xử khi so sánh với một số lựa chọn thay thế mà chúng tôi sắp xem xét. Các câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;75 và
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 được mô tả trong các phần sau cho phép chúng tôi tạo các vòng lặp dễ viết, đọc và bảo trì hơn
Các câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 và
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;74 có thể được sử dụng để tạo một vòng lặp tiếp tục cho đến khi một số điều kiện logic được đáp ứng. Cú pháp của
[15 làlabel
:] LOOPstatements
END LOOP [label
];
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;9
Một vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 tiếp tục cho đến khi biểu thức được xác định trong mệnh đề
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;74 ước tính là TRUE. Về bản chất, một vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 về mặt logic tương đương với một khối
[19 như thế nàylabel
:] LOOPstatements
END LOOP [label
];
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;4
Vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 dễ bảo trì hơn một chút vì rõ ràng hơn điều kiện nào sẽ khiến vòng lặp kết thúc. Câu lệnh
LEAVE label;0 trong một vòng lặp đơn giản có thể ở bất kỳ đâu, trong khi câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;74 luôn được liên kết với mệnh đề
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;93 ở cuối vòng lặp. Hơn nữa, chúng ta không cần chỉ định nhãn cho vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 vì điều kiện
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;74 luôn dành riêng cho vòng lặp hiện tại. Tuy nhiên, chúng tôi vẫn khuyên bạn nên sử dụng các nhãn có vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 để cải thiện khả năng đọc, đặc biệt nếu các vòng lặp được lồng vào nhau
Ví dụ 4-22 cho thấy sử dụng
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73 để in ra các số lẻ nhỏ hơn 10. So sánh cú pháp này với cú pháp của ví dụ trước bằng cách sử dụng các câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5 và
LEAVE label;0
Ví dụ 4-22. Ví dụ về vòng lặp REPEAT
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;5
Có một vài điều đáng chú ý về vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73
Một vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
73 luôn được đảm bảo chạy ít nhất một lần—tức là, điều kiệnInfinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
74 được đánh giá lần đầu tiên sau lần thực hiện đầu tiên của vòng lặp. Đối với các vòng lặp không được chạy dù chỉ một lần trừ khi thỏa mãn một số điều kiện, hãy sử dụngInfinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
75 [xem phần tiếp theo]Sử dụng
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
14 trong vòng lặpInfinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
73 có thể dẫn đến kết quả không mong muốn, vì làm như vậy sẽ bỏ qua kiểm traInfinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
74 và có thể dẫn đến việc thực thi vòng lặp mặc dù điều kiệnInfinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
74 không còn được thỏa mãn. Do đó, có thể bạn sẽ không muốn sử dụngInfinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
14 trong vòng lặpInfinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;
73
Một vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;75 thực thi miễn là một điều kiện là đúng. Nếu điều kiện không đúng ngay từ đầu, thì vòng lặp sẽ không bao giờ thực thi—không giống như vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;73, được đảm bảo thực hiện ít nhất một lần
Vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;75 có cú pháp như sau
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;9
Một vòng lặp
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;75 có chức năng tương đương với một cấu trúc
[19 đơn giản có mệnh đềlabel
:] LOOPstatements
END LOOP [label
];
LEAVE label;0 là câu lệnh đầu tiên của nó, như được mô tả trong phần “LỜI CHÀO”. Ví dụ 4-23 chứng minh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;56
Ví dụ 4-23. LOOP-END LOOP thực hiện chức năng tương tự như vòng lặp WHILE
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;0
Ví dụ 4-24 cho thấy vòng lặp số lẻ nhỏ hơn 10 của chúng tôi được triển khai bằng cách sử dụng
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;75
Ví dụ 4-24. Các số lẻ nhỏ hơn 10 được triển khai dưới dạng vòng lặp WHILE
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;1
Chúng ta thường muốn lồng các vòng lặp. Trong đoạn mã đơn giản trong Ví dụ 4-25, chúng ta in ra “bảng thời gian” cơ bản bằng cách sử dụng cấu trúc
[19 lồng nhaulabel
:] LOOPstatements
END LOOP [label
];
Ví dụ 4-25. Ví dụ về vòng lặp lồng nhau
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;2
Khi lồng các vòng lặp, đặc biệt hữu ích khi gắn nhãn bắt đầu và kết thúc vòng lặp để liên kết rõ ràng phần đầu của mỗi vòng lặp với phần cuối của nó. Tất nhiên, nếu chúng ta cần sử dụng
LEAVE label;0, chúng ta phải gắn nhãn cho vòng lặp
Nhận xét chia tay trên vòng lặp
Bây giờ chúng ta đã thấy ba thuật toán lặp đơn giản và giống hệt nhau được triển khai bằng cách sử dụng ba cấu trúc lặp có sẵn trong ngôn ngữ chương trình được lưu trữ MySQL. Mỗi cấu trúc trong số ba cấu trúc vòng lặp có khả năng thực hiện hầu như bất kỳ logic vòng lặp nào mà bạn có thể cần thực hiện
Các vòng lặp ví dụ được đưa ra trong chương này khá đơn giản và ít liên quan đến thế giới thực. Chúng tôi làm điều này một phần vì mục đích rõ ràng, nhưng cũng vì thực tế là trong lập trình được lưu trữ, hầu hết tất cả các cấu trúc vòng lặp của bạn sẽ liên quan đến việc lặp qua các hàng được trả về bởi câu lệnh
Infinite_loop: LOOP SELECT 'Welcome to my infinite loop from hell!!'; END LOOP inifinite_loop;3, đây là chủ đề của chương tiếp theo