【问题标题】:For loop example in MySQLMySQL中的for循环示例
【发布时间】:2011-07-04 17:59:57
【问题描述】:

在 MySQL 中,我有这个带有 LOOP 的存储过程:

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 循环的正确语法是什么?

【问题讨论】:

  • 这将创建存储过程名称 ABC。您的数据格式是什么(您要加载的格式)?
  • 我不想要任何数据格式,我只想打印一个从 1 到 5 的值
  • 我刚刚尝试了这段代码,它对我有用。我不得不添加 CALL ABC();但它奏效了。我还在最后添加了 DROP PROCEDURE ABC(),因为我只是将它作为测试运行。

标签: mysql for-loop


【解决方案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 $$

【讨论】:

    【解决方案2】:

    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 循环构造投入生产,我会用泡沫导弹发射器射击你。你可以用管钳敲钉子,但这样做会让你看起来很傻。

    【讨论】:

    • 按照您给出的代码,在 MySQL (5.6) 控制台中输入 declare str VARCHAR(255) default ''; 会给我错误消息 Error 1064 (42000): ... for the right syntax to use near '' at line 3,它像泥巴一样清晰(尽管我认为它没有像 DEFAULT 子句)。
    • 它曾经在以前的版本中工作。我认为更改行尾分隔符:在运行此命令之前使用命令delimiter //
    • 我们可以在 While 内使用 Iterate 和 Leave 吗?这些充当继续和中断。 Iterate的工作方式和java中的continue类似吗?
    【解决方案3】:

    假设您有一个名为“table1”的表。它包含一列 varchar 类型的“col1”。下面给出了对 crate 表的查询

    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`()
    

    【讨论】:

      【解决方案4】:
      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/…。我的主要问题是,如果我只想使用LOOP,是否有必要使用BEGIN...END并创建一个程序?
      • 如果您遇到分隔符问题,阅读stackoverflow.com/a/10259528/632951
      • @Ktaria - 循环示例的关键点(无论如何实现)是开始事务和提交的位置 - 为什么会这样?
      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 2022-12-05
      • 2019-03-05
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      相关资源
      最近更新 更多