MySQL的游标循环不更新(MySQL Cursor Loop does not update)

2019-10-18 09:02发布

我会为一些帮助,我写了一个MySQL的存储过程表示感谢。 这是在Windows在MySQL 5.6.11运行,我已阅读和重新阅读MySQL的文档,并进行了一些谷歌搜索。

背景

我有数据库用于存储与产品,并在某些情况下,我想从一个产品记录复制并插入另一产品记录,或从一个产品的记录,并在特定的产品组插入到所有的产品记录,以创造新的相关信息相关联。 我可以成功地从一个一个产品记录复制并插入另一产品的纪录,但我从一个产品记录有问题的复制,然后在特定的产品组的所有产品记录插入。

最初的研究表明,一光标作为存储过程的一部分可以provde的溶液。 在我有问题的方面有两个表参与,一个子弹,这种子弹持有点,我想复制它们。 第二个表是主表,并将其保存的产品的数据,例如产品代码和与产品代码相关联的产品组代码。

我希望在子弹表通过创造新的记录:

  • 检索子弹记录特定的产品代码,例如我有一个产品代码10001 4个子弹reocrds。
  • 然后,我想选择的所有产品的产品组中,例如有在产品组3 81个产品代码。
  • 然后在产品组3的每个产品代码中,我想创建每一个子弹新纪录。

这意味着,81×4的新记录将被添加到bulets表。

请注意,我用的LibreOffice基地,形式和宏用MySQL来ineract。

我做了什么

我已经制定了,我可以用下面的语句做了一对一的副本:

INSERT INTO bullets (product_code, bullet_text) SELECT 'fromCode', bullet_text
FROM bullets WHERE product_code = 'toCode'

凡fromCode和toCode由LibreOffice的基本形式提供,并且使用的LibreOffice Basic脚本处理,这一切工作正常。 希望我不会提供太多的多余信息。

所以我的想法是,我可以使用光标通过产品代码以获取特定产品组,然后循环产品代码写我的新纪录写一个存储过程。 下面是存储过程:

BEGIN
    DECLARE product_code_from_group VARCHAR(30);
    DECLARE from_product_code VARCHAR(30);
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur_get_product_codes CURSOR FOR
        SELECT product_code FROM master
        WHERE product_group = to_product_group ;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

    OPEN cur_get_product_codes;

    copybullets: LOOP
        FETCH cur_get_product_codes INTO product_code_from_group;
    IF done THEN
        CLOSE cur_get_product_codes;
        LEAVE copybullets;
    END IF;

    INSERT INTO bullets (product_code, bullet_text) 
    SELECT product_code_from_group, bullet_text 
    FROM bullets
    WHERE product_code = from_product_code;

    END LOOP;

    CLOSE cur_get_product_codes;

END

当我执行它似乎运行,但没有创建新的记录。 我使用的测试它

 CALL copy_bullets_test(10001,3)
  • 10001是我从收到子弹的代码
  • 3是我使用得procducts的列表中选择产品组。

我敢肯定,问题是我有限的知识,我已经仔细阅读罗兰Boumans博客复制的代码,但我一定是失去了一些东西。 这看起来好像我的代码不迭代虽然循环,但我不知道为什么。

Answer 1:

如果我理解正确你需要的是CROSS JOIN 。 尝试

INSERT INTO bullets (product_code, bullet_text) 
SELECT m.product_code, b.bullet_text 
  FROM bullets b CROSS JOIN master m
 WHERE b.product_code = 10001
   AND m.product_group = 3
   AND m.product_code <> 10001;

这是SQLFiddle演示。

现在,你可以把它包装成一个存储过程,如果你去了

CREATE PROCEDURE copy_bullets_test (IN product_code_from INT, IN product_group_to INT)
INSERT INTO bullets (product_code, bullet_text) 
SELECT m.product_code, b.bullet_text 
  FROM bullets b CROSS JOIN master m
 WHERE b.product_code = product_code_from
   AND m.product_group = product_group_to
   AND m.product_code <> product_code_from;

并用它

CALL copy_bullets_test(10001, 3);

这里是SQLFiddle该案例演示。



文章来源: MySQL Cursor Loop does not update