簡體   English   中英

為什么這個mysql存儲過程不能重復執行SELECT

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM