MySQL中的For循环示例


104

在MySQL中,我有一个带有For循环的存储过程:

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 $$

它总是打印1。MySQL for循环的正确语法是什么?


这将创建存储过程名称ABC。您的数据格式是什么(要加载的一种)?
Zimbabao 2011年

我不需要任何数据格式,我只想打印一个1到5之间的值
Chitresh 2011年

我只是尝试了这段代码,它为我工作。我必须添加CALL ABC(); 但是成功了 最后,我还添加了DROP PROCEDURE ABC(),因为我只是将其作为测试运行。
艾伦·斯图尔特

Answers:


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;

谢谢您的回答,它对我有所帮助。您还可以看到我的问题stackoverflow.com/questions/12259675/…吗?我的主要问题是,BEGIN...END如果我只想使用,是否需要使用和创建一个过程LOOP
绿色

1
如果您在定界符方面遇到问题,请阅读stackoverflow.com/a/10259528/632951
Pacerier,2015年

61

MySQL中的while循环语法示例:

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//

哪些打印:

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

MySQL中的REPEAT循环语法示例:

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//

哪些打印:

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

MySQL中的FOR循环语法示例:

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//

哪些打印:

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

执行本教程:http : //www.mysqltutorial.org/stored-procedures-loop.aspx

如果我发现您将这种MySQL for循环构造推入生产,那么我将用泡沫导弹发射器向您射击。您可以使用管扳手敲打钉子,但是这样做会使您看起来很傻。


2
按照您给出的代码,declare str VARCHAR(255) default '';在MySQL(5.6)控制台中键入会给我错误消息Error 1064 (42000): ... for the right syntax to use near '' at line 3,它很清晰(尽管我认为它不喜欢DEFAULT子句)。
Agi Hammerthief,2015年

它曾经在以前的版本中工作。我认为这是行定界符更改的结尾:delimiter //在运行此命令之前使用命令。
埃里克·莱斯钦斯基

我们还可以使用While并在其中保留迭代吗?这些充当继续和中断。Iterate的工作类似于在Java中继续吗?
迪帕克

13

假设您有一个名为“ table1”的表。它包含一列varchar类型的“ col1”。查询板条箱表如下

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

现在,如果要在该表中插入1到50之间的数字,请使用以下存储过程

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 $$

要调用该存储过程,请使用

CALL `ABC`()

1

您可以将此局部变量交换为全局变量,这会更容易。

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 $$
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.