gpt4 book ai didi

mysql - 为什么这个mysql存储过程不重复执行SELECT

转载 作者:行者123 更新时间:2023-11-29 10:50:15 25 4
gpt4 key购买 nike

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

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,然后显然退出循环。

如果我在现有 select 上方放置一个“SELECT snum”,那么它会打印 1,然后退出,而不是打印全部。

这一定是一些微不足道的事情,但我已经尝试过 CONTINUE 处理程序,以及各种胡闹。我已经阅读了有关它是否是确定性的文档,我没有使用任何类型的复制,并且我通常在 Perl 中执行此类操作,但我认为我应该了解更多有关它的信息,因此......

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

最佳答案

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

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

仅执行一次 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 语句后确定该过程正在退出。

关于mysql - 为什么这个mysql存储过程不重复执行SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com