【问题标题】:Insert and Update commands after a LOOP statement在 LOOP 语句之后插入和更新命令
【发布时间】:2013-12-17 10:04:32
【问题描述】:

我正在尝试在 MySql 中创建一个存储过程,它需要在 END LOOP 标记之后继续进行进一步的更新,就像下面的代码一样。

不知何故,END LOOP 标记后的插入命令没有被执行,有人能告诉我为什么吗?我该如何解决这个问题?

BEGIN
/**Constant variables*/
DECLARE constX  FLOAT DEFAULT 2.660;
DECLARE constMR FLOAT DEFAULT 3.268;

/**Variables for tbSell*/
DECLARE seID, prodID INTEGER DEFAULT 0;
DECLARE qttSell, xV FLOAT DEFAULT 0;
DECLARE previousQttSell, previousXV FLOAT DEFAULT NULL;
DECLARE sPrice, xAvgV, mRAvgV, xUclV, xLclV, mRUclV FLOAT DEFAULT 0;
DECLARE sDt DATE DEFAULT 0;

DECLARE crQttSell CURSOR FOR 
    SELECT ts.`sellQuantity`
    FROM tb_sell ts
    WHERE ts.`productID` = 1;

/**Truncating temp tables*/
TRUNCATE tb_metrics;
TRUNCATE `tb_mr_temp_table`;

OPEN crQttSell;
get_QttSell: LOOP
    FETCH crQttSell INTO qttSell;    
    INSERT INTO tb_metrics VALUES('', 4, 4, 4, 4, 4, 4, 4, 4, 555);    
    SET previousQttSell = qttSell;    
END LOOP get_QttSell;
CLOSE crQttSell;

INSERT INTO tb_metrics VALUES('', 6, 6, 6, 6, 6, 6, 6, 6, 7);

END

【问题讨论】:

    标签: mysql loops insert


    【解决方案1】:

    您必须在 fetch 语句之后检测 EOF 条件以避免无限循环:

      DECLARE done INT DEFAULT FALSE;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
      ....
      ....
      get_QttSell: LOOP
        FETCH crQttSell INTO qttSell;   
        IF done THEN
          LEAVE get_QttSell;
        END IF; 
        INSERT INTO tb_metrics VALUES('', 4, 4, 4, 4, 4, 4, 4, 4, 555);    
        SET previousQttSell = qttSell;    
      END LOOP get_QttSell;
      ....
    

    阅读文档了解详情:http://dev.mysql.com/doc/refman/5.6/en/cursors.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多