Thủ tục được lưu trữ trong khi lặp mysql

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:] LOOP
        statements
    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

    [label:] LOOP
        statements
    END LOOP 
 [label];
1

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
    [label:] LOOP
        statements
    END LOOP 
 [label];
15 là

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
    [label:] LOOP
        statements
    END LOOP 
 [label];
19 như thế này

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ện
    Infinite_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ụng
    Infinite_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ặp
    Infinite_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 tra
    Infinite_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ện
    Infinite_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ụng
    Infinite_loop: LOOP
        SELECT 'Welcome to my infinite 
     loop from hell!!';
    END LOOP inifinite_loop;
    14 trong 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;
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
    [label:] LOOP
        statements
    END LOOP 
 [label];
19 đơn giản có mệnh đề
    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

    [label:] LOOP
        statements
    END LOOP 
 [label];
19 lồng nhau

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

Làm cách nào để lặp trong thủ tục lưu trữ MySQL?

Cú pháp chung để triển khai một vòng lặp MySQL đơn giản là. .
[bắt đầu_nhãn. ] VÒNG. tuyên bố_list. VÒNG KẾT THÚC [end_label]
[Tên]. VÒNG. tuyên_bố; . RỜI [nhãn];
THỦ TỤC XẢ NẾU TỒN TẠI loopMe; . KHAI BÁO tôi INT;

Chúng ta có thể sử dụng vòng lặp while trong MySQL không?

Câu lệnh vòng lặp WHILE của MySQL được sử dụng để thực hiện lặp đi lặp lại một hoặc nhiều câu lệnh, miễn là điều kiện là đúng. Chúng ta có thể sử dụng vòng lặp khi cần thực hiện tác vụ lặp lại trong khi điều kiện là đúng .

Làm cách nào để lặp trong thủ tục lưu trữ SQL?

Vòng lặp thủ tục lưu sẵn SQL Server thông qua tập kết quả . Sau đó, chúng tôi mở con trỏ và bắt đầu tìm nạp từng hàng một và lưu trữ các giá trị vào các biến và hiển thị chúng ở đầu ra. @@FETCH_STATUS là một biến toàn cục.

Làm cách nào để chèn dữ liệu vào MySQL bằng vòng lặp?

Câu trả lời. BEGIN DECLARE var INT; . 00 giờ sáng. Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM.