【问题标题】:insert into select statement inside while loop in sp mysql在sp mysql中的while循环内插入select语句
【发布时间】:2012-12-16 13:02:34
【问题描述】:

我有一个存储过程,我在 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 ;

【问题讨论】:

    标签: mysql loops stored-procedures while-loop


    【解决方案1】:

    您确实需要避免在 SQL 中以 RBAR 方式执行操作。 RBAR(发音为 REEBAR)代表 row by agonizing row。在逐行插入数据时,您可能会在以后遇到严重的性能问题。

    我没有您的表结构,但我怀疑您可以将整个存储过程更改为以下内容,这样会更快更高效。如果可以请为查询中涉及的表发布 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 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2022-01-07
      • 2020-05-07
      • 2021-06-03
      • 2015-01-14
      • 2019-11-30
      相关资源
      最近更新 更多