为什么这个mysql存储过程没有重复执行SELECT

时间:2017-05-08 22:14:26

标签: mysql stored-procedures

以下是存储过程。我的第一次尝试。

BEGIN
  DECLARE snum TINYINT;

  SET snum = 1;
  WHILE snum <= 10 DO
    SELECT snum, PUR__LIST.LPUpdatedDateTime FROM PUR__LIST 
        WHERE PUR__LIST.StoreNum = snum
        ORDER BY PUR__LIST.LPUpdatedDateTime DESC
        LIMIT 1;
    SET snum = snum + 1;
  END WHILE;
END

我只想执行相同的语句10次,改变1个参数。

如果我从CLI手动运行SQL,(模块用正确的数字替换snum),它会按预期工作。如果我调用存储过程,它运行snum = 1,然后显然退出循环。

如果我放一个&#34; SELECT snum&#34;在现有的选择之上,然后它打印1,然后退出而不是打印所有这些。

这必须是微不足道的,但我已经尝试过CONTINUE处理程序,以及各种各样的monkeying。我已经阅读了文档,如果它是确定性的,我没有使用任何类型的复制,我通常在Perl中做这种事情,但我想我应该更多地了解它,因此此...

任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

之前留下作为对该问题的评论,在此重复:

MySQL命令行工具应显示返回的每个单独的结果集。

根本不清楚你是如何确定程序是&#34;退出循环&#34;只执行一次SELECT语句后。

如果我们使用Perl DBI,在完成第一个结果集后,我们需要使用more_results来获取下一个结果集。

参考:http://search.cpan.org/~michielb/DBD-mysql-4.042/lib/DBD/mysql.pm#MULTIPLE_RESULT_SETS

使用MySQL命令行客户端的演示:

设置:

mysql> use test;
Database changed
mysql> CREATE TABLE `PUR__LIST`
    -> ( `StoreNum`          INT(10) UNSIGNED NOT NULL DEFAULT '0'
    -> , `LPUpdatedDateTime` DATETIME NOT NULL DEFAULT '1970-01-02'
    -> , PRIMARY KEY (`StoreNum`,`LPUpdatedDateTime`)
    -> ) ENGINE=INNODB
    -> ;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO `PUR__LIST` (`StoreNum`, `LPUpdatedDateTime`) VALUES
    ->  (1,'2017-05-08 11:00')
    -> ,(1,'2017-05-08 12:00')
    -> ,(2,'2017-05-08 13:00')
    -> ,(2,'2017-05-08 14:00')
    -> ,(3,'2017-05-08 15:00')
    -> ,(3,'2017-05-08 16:00')
    -> ,(4,'2017-05-08 17:00')
    -> ,(4,'2017-05-08 18:00')
    -> ,(5,'2017-05-08 19:00')
    -> ,(5,'2017-05-08 20:00')
    -> ,(6,'2017-05-08 21:00')
    -> ,(7,'2017-05-08 22:00')
    -> ,(9,'2017-05-09 10:00')
    -> ;
Query OK, 13 rows affected (0.01 sec)
Records: 13  Duplicates: 0  Warnings: 0

创建存储过程:

mysql> DELIMITER $$
mysql> CREATE PROCEDURE foo()
    -> BEGIN
    ->   DECLARE snum TINYINT;
    ->
    ->   SET snum = 1;
    ->   WHILE snum <= 10 DO
    ->     SELECT snum, PUR__LIST.LPUpdatedDateTime FROM PUR__LIST
    ->         WHERE PUR__LIST.StoreNum = snum
    ->         ORDER BY PUR__LIST.LPUpdatedDateTime DESC
    ->         LIMIT 1;
    ->     SET snum = snum + 1;
    ->   END WHILE;
    -> END$$
Query OK, 0 rows affected (0.01 sec)

mysql> DELIMITER ;

执行存储过程:

mysql> CALL foo;
+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    1 | 2017-05-08 12:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    2 | 2017-05-08 14:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    3 | 2017-05-08 16:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    4 | 2017-05-08 18:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    5 | 2017-05-08 20:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    6 | 2017-05-08 21:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    7 | 2017-05-08 22:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

Empty set (0.00 sec)

+------+---------------------+
| snum | LPUpdatedDateTime   |
+------+---------------------+
|    9 | 2017-05-09 10:00:00 |
+------+---------------------+
1 row in set (0.00 sec)

Empty set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql>

那个十个单独的结果集。其中两个结果集为空(不包含任何行),其他结果集只包含一行。返回所有结果集,但是由客户端调用该过程以从每个返回的结果集中检索行。

SELECT语句的每次执行都会添加另一个结果集。它将行附加到前一个结果集。

同样,它根本不清楚你在问什么。或者在执行只有一个SELECT语句之后确定该过程是如何退出的。