簡體   English   中英

在sp mysql的while循環內插入select語句

[英]insert into select statement inside while loop in sp mysql

我有一個存儲過程,其中我在while循環內插入了select語句。 存儲過程創建成功,但是當我執行它時,它說受影響的0行。 在沒有while循環的情況下,sp會返回數據。 但是當同一個查詢在while循環內時,它將返回受影響的0行。

有什么問題

DELIMITER $$

CREATE PROCEDURE WhileLoopProc1234(INOUT indate DATE,INOUT outdate DATE)
BEGIN
   DECLARE x DATE;
   DECLARE y DATE;
   DECLARE z DATE;

   CREATE TABLE temp2( cardno VARCHAR(10),datevalue DATE );
   SET x = indate;
   SET y = outdate;

   WHILE x!=y DO
      INSERT INTO temp2( cardno,datevalue)
      select CARDNO,x from test_prefixmaster
      where CARDNO not in ( select CARDNO from test_prefixtransactions where    Date(S_DateTime)=x);

     SET x = x + 1;
   END WHILE;

   SELECT * from temp2;

   DROP TABLE temp2;

END$$
DELIMITER ;

您確實需要避免在SQL中使用RBAR方法。 RBAR(發音為REEBAR)代表通過折行來表示行。 一次一行一組地插入數據時,以后可能會遇到嚴重的性能問題。

我沒有您的表結構,但我懷疑您可以將整個存儲過程更改為以下內容,它將更快,更高效。 如果您可以為查詢中涉及的表發布CREATE TABLE語句,我將能夠確保此查詢正確。 據我了解,您正在嘗試查找在test_prefixmaster中對於日期范圍不存在的CARDNO。

因此,整個存儲過程可以如下所示:

DELIMITER $$

CREATE PROCEDURE WhileLoopProc1234(INOUT indate DATE,INOUT outdate DATE)
BEGIN

   SELECT tst_pfMaster.CARDNO
          ,tst_pfTran.S_DateTime
   FROM test_prefixmaster tst_pfMaster
   LEFT JOIN test_prefixtransactions  tst_pfTran
        ON tst_pfMaster.CARDNO = tst_pfTran.CARDNO
   WHERE (tst_pfMaster.CARDNO  IS NULL)
         AND (
               (DATE(S_DateTime)>=indate)
               AND (DATE(S_DateTime)<=outdate) 
             )

 END$$
 DELIMITER ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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