Ví dụ về vòng lặp trong MySQL


104

Trong MySQL, tôi có thủ tục được lưu trữ này với vòng lặp For trong đó:

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 0 ;
      simple_loop: LOOP
         SET a=a+1;
         select a;
         IF a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

Nó luôn luôn in 1. Cú pháp chính xác cho vòng lặp for trong MySQL là gì?


Điều này tạo tên thủ tục cửa hàng ABC. Định dạng dữ liệu của bạn là gì (định dạng bạn muốn tải) ?.
Zimbabao

tôi không muốn bất kỳ định dạng dữ liệu nào, tôi chỉ muốn in một giá trị từ 1 đến 5
Chitresh

Tôi vừa thử mã này và nó đã làm việc cho tôi. Tôi đã phải thêm CALL ABC (); nhưng nó đã hoạt động. Tôi cũng đã thêm DROP PROCEDURE ABC () vào cuối vì tôi chỉ chạy nó như một thử nghiệm.
Alan Stewart

Câu trả lời:


143
drop table if exists foo;
create table foo
(
id int unsigned not null auto_increment primary key,
val smallint unsigned not null default 0
)
engine=innodb;

drop procedure if exists load_foo_test_data;

delimiter #
create procedure load_foo_test_data()
begin

declare v_max int unsigned default 1000;
declare v_counter int unsigned default 0;

  truncate table foo;
  start transaction;
  while v_counter < v_max do
    insert into foo (val) values ( floor(0 + (rand() * 65535)) );
    set v_counter=v_counter+1;
  end while;
  commit;
end #

delimiter ;

call load_foo_test_data();

select * from foo order by id;

Cảm ơn bạn đã trả lời của bạn, nó đã giúp tôi. Bạn có thể tốt bụng khi xem câu hỏi của tôi stackoverflow.com/questions/12259675/… . Câu hỏi chính của tôi là, có cần thiết phải sử dụng BEGIN...ENDvà tạo một thủ tục nếu tôi chỉ muốn sử dụng LOOPkhông?
Màu xanh lá cây

1
Nếu bạn gặp sự cố với dấu phân cách, hãy đọc stackoverflow.com/a/10259528/632951
Pacerier

61

Ví dụ về cú pháp vòng lặp While trong MySQL:

delimiter //

CREATE procedure yourdatabase.while_example()
wholeblock:BEGIN
  declare str VARCHAR(255) default '';
  declare x INT default 0;
  SET x = 1;

  WHILE x <= 5 DO
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
  END WHILE;

  select str;
END//

Bản in nào:

mysql> call while_example();
+------------+
| str        |
+------------+
| 1,2,3,4,5, |
+------------+

Ví dụ về cú pháp vòng lặp REPEAT trong MySQL:

delimiter //

CREATE procedure yourdb.repeat_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = 5;
  SET str = '';

  REPEAT
    SET str = CONCAT(str,x,',');
    SET x = x - 1;
    UNTIL x <= 0
  END REPEAT;

  SELECT str;
END//

Bản in nào:

mysql> call repeat_loop_example();
+------------+
| str        |
+------------+
| 5,4,3,2,1, |
+------------+

Ví dụ về cú pháp vòng lặp FOR trong MySQL:

delimiter //

CREATE procedure yourdatabase.for_loop_example()
wholeblock:BEGIN
  DECLARE x INT;
  DECLARE str VARCHAR(255);
  SET x = -5;
  SET str = '';

  loop_label: LOOP
    IF x > 0 THEN
      LEAVE loop_label;
    END IF;
    SET str = CONCAT(str,x,',');
    SET x = x + 1;
    ITERATE loop_label;
  END LOOP;

  SELECT str;

END//

Bản in nào:

mysql> call for_loop_example();
+-------------------+
| str               |
+-------------------+
| -5,-4,-3,-2,-1,0, |
+-------------------+
1 row in set (0.00 sec)

Làm theo hướng dẫn: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Nếu tôi bắt gặp bạn đang đẩy loại cấu trúc vòng lặp MySQL này vào sản xuất, tôi sẽ bắn bạn bằng bệ phóng tên lửa bọt. Bạn có thể dùng cờ lê để đóng đinh, nhưng làm như vậy sẽ khiến bạn trông ngớ ngẩn.


2
Theo mã bạn đã cung cấp, nhập declare str VARCHAR(255) default '';vào bảng điều khiển MySQL (5.6) cho tôi thông báo lỗi Error 1064 (42000): ... for the right syntax to use near '' at line 3, thông báo này rõ ràng như bùn (mặc dù tôi cho rằng nó không thích mệnh đề DEFAULT).
Agi Hammerthief

Nó đã từng hoạt động trong các phiên bản trước. Tôi nghĩ rằng đó là dấu phân cách cuối dòng để thay đổi: sử dụng lệnh delimiter //trước khi chạy điều này.
Eric Leschinski

Chúng ta có thể sử dụng Lặp lại và Rời khỏi trong While cũng được không? Chúng đang hoạt động như tiếp tục và phá vỡ. Lặp lại có hoạt động tương tự như tiếp tục trong java không?
Deepak

13

Giả sử bạn có một bảng với tên 'table1'. Nó chứa một cột 'col1' với kiểu varchar. Bảng truy vấn đến thùng được đưa ra bên dưới

CREATE TABLE `table1` (
    `col1` VARCHAR(50) NULL DEFAULT NULL
)

Bây giờ nếu bạn muốn chèn số từ 1 đến 50 trong bảng đó, hãy sử dụng quy trình được lưu trữ sau

DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      DECLARE a INT Default 1 ;
      simple_loop: LOOP         
         insert into table1 values(a);
         SET a=a+1;
         IF a=51 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$

Để gọi thủ tục được lưu trữ đó, hãy sử dụng

CALL `ABC`()

1

Bạn có thể trao đổi biến cục bộ này cho toàn cục, điều đó sẽ dễ dàng hơn.

DROP PROCEDURE IF EXISTS ABC;
DELIMITER $$  
CREATE PROCEDURE ABC()

   BEGIN
      SET @a = 0;
      simple_loop: LOOP
         SET @a=@a+1;
         select @a;
         IF @a=5 THEN
            LEAVE simple_loop;
         END IF;
   END LOOP simple_loop;
END $$
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.