![](/img/trans.png)
[英]Why does this MySQL stored procedure not seem to execute its exit handler?
[英]Why does this mysql stored procedure not execute the SELECT repeatedly
以下是存儲過程。 我的第一次嘗試。
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 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語句后該過程正在退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.