【问题标题】:Mysql nested while loop in a Stored ProcedureMysql在存储过程中嵌套while循环
【发布时间】:2013-06-20 00:54:54
【问题描述】:

目前我正在处理一个存储过程,其中我在另一个 while 循环下使用一个 while 循环。但我没有得到预期的结果。最外层的循环是迭代一次。

我正在尝试以下代码。

DELIMITER $$

DROP PROCEDURE IF EXISTS `First_Sp` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `First_Sp`()
BEGIN

  DECLARE first_while_start  INTEGER DEFAULT 1;
  DECLARE second_while_start INTEGER DEFAULT 1;
  DECLARE first_while_count  INTEGER DEFAULT 3;
  DECLARE second_while_count INTEGER DEFAULT 3;

  WHILE first_while_start < first_while_count
  DO
    WHILE second_while_start < second_while_count
    DO
      SELECT concat(first_while_start,' - ',second_while_start) as result;
      SET second_while_start = second_while_start + 1;
    END WHILE;
    SET first_while_start = first_while_start + 1;
  END WHILE;
END $$

DELIMITER ;  

结果:

mysql> call first_sp();
+--------+
| result |
+--------+
| 1 - 1  |
+--------+
1 row in set (0.00 sec)

+--------+
| result |
+--------+
| 1 - 2  |
+--------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec).

我也尝试过重复循环。但还是没有运气。

DELIMITER $$

DROP PROCEDURE IF EXISTS `First_Sp` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `First_Sp`()
BEGIN

  DECLARE first_while_start  INTEGER DEFAULT 1;
  DECLARE second_while_start INTEGER DEFAULT 1;
  DECLARE first_while_count  INTEGER DEFAULT 3;
  DECLARE second_while_count INTEGER DEFAULT 3;

  REPEAT
    WHILE second_while_start < second_while_count
    DO
      SELECT concat(first_while_start,' - ',second_while_start) as result;
      SET second_while_start = second_while_start + 1;
    END WHILE;
    SET first_while_start = first_while_start + 1;
  UNTIL first_while_start < first_while_count
  END REPEAT;

END $$

DELIMITER ;

我不是 SQL Developer。我正在努力。

【问题讨论】:

    标签: mysql stored-procedures while-loop


    【解决方案1】:

    这是因为在外部 while 循环的第一次迭代之后,second_while_start 的值已经是second_while_count,因此内部循环不会执行,因为second_while_start 不再小于second_while_count。

    要获得“预期结果”,您需要重置 second_while_start。

    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS `First_Sp` $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `First_Sp`()
    BEGIN
    
      DECLARE first_while_start  INTEGER DEFAULT 1;
      DECLARE second_while_start INTEGER DEFAULT 1;
      DECLARE first_while_count  INTEGER DEFAULT 3;
      DECLARE second_while_count INTEGER DEFAULT 3;
    
      WHILE first_while_start < first_while_count
      DO
        WHILE second_while_start < second_while_count
        DO
          SELECT concat(first_while_start,' - ',second_while_start) as result;
          SET second_while_start = second_while_start + 1;
        END WHILE;
        SET first_while_start = first_while_start + 1;
        /*here comes the important line:*/
        SET second_while_start = 1;
      END WHILE;
    END $$
    
    DELIMITER ;
    

    【讨论】:

    • 先是没看懂,后来又没看懂。工作。然后就明白了?
    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多