以下是存储过程。我的第一次尝试。
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中做这种事情,但我想我应该更多地了解它,因此此...
任何帮助表示赞赏。感谢。
答案 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语句之后确定该过程是如何退出的。