Câu hỏi Ví dụ về vòng lặp trong MySQL


Trong MySQL, tôi có thủ tục lưu sẵn 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 một vòng lặp MySQL là gì?


76
2018-02-26 04:35


gốc


Điều này tạo ra các thủ tục lưu trữ tên ABC. Định dạng dữ liệu của bạn (định dạng bạn muốn tải) là gì ?. - 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


Các câu trả lời:


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;

113
2018-02-26 11:36



Cảm ơn câu trả lời của bạn, nó đã giúp tôi. Bạn có thể rất tử tế để xem câu hỏi của tôi không stackoverflow.com/questions/12259675/…. Câu hỏi chính của tôi là, nó là cần thiết để sử dụng BEGIN...END và tạo một thủ tục nếu tôi chỉ muốn sử dụng LOOP? - Green
Nếu bạn gặp sự cố với dấu phân cách, đọc stackoverflow.com/a/10259528/632951 - Pacerier


Trong khi ví dụ cú pháp vòng lặp 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ụ 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ụ 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 hướng dẫn: http://www.mysqltutorial.org/stored-procedures-loop.aspx

Nếu tôi bắt bạn đẩy loại cấu trúc MySQL này vào sản xuất, tôi sẽ bắn bạn bằng công cụ phóng tên lửa bọt. Bạn có thể sử dụng một chìa khoá ống để đập vào một móng tay, nhưng làm như vậy làm cho bạn trông ngớ ngẩn.


44
2017-12-25 05:05



Theo mã bạn đã nhập, nhập declare str VARCHAR(255) default ''; trong giao diện điều khiển MySQL (5.6) cung cấp cho tôi thông báo lỗi Error 1064 (42000): ... for the right syntax to use near '' at line 3, rõ ràng là bùn (mặc dù tôi cho rằng nó không thích mệnh đề DEFAULT). - Agi Hammerthief
Nó được sử dụng để làm việc trong các phiên bản trước. Tôi nghĩ rằng đó là dấu phân cách cuối của dòng để thay đổi: sử dụng lệnh delimiter // trước khi chạy. - Eric Leschinski
Chúng ta có thể sử dụng Iterate và Leave trong khi còn? Đây là những hành động như tiếp tục và phá vỡ. Iterate có hoạt động tương tự như tiếp tục trong java không? - Deepak


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

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 đó thì hãy sử dụng thủ tục đã lưu 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 đó là thủ tục lưu trữ sử dụng

CALL `ABC`()

10
2017-10-11 11:58