对于我编写的MySQL存储过程的一些帮助,我将不胜感激。它在Windows上的MySQL 5.6.11上运行,我已阅读并重新阅读MySQL文档,并进行了大量的谷歌搜索。
背景
我有用于存储与产品相关的信息的数据库,在某些情况下,我想通过从一个产品记录复制并插入另一个产品记录或从一个产品记录中插入特定产品中的所有产品记录来创建新的相关信息组。我可以成功地从一个产品记录中复制并插入另一个产品记录,但是我无法从一个产品记录复制,然后插入特定产品组中的所有产品记录。
最初的研究表明,将游标作为存储过程的一部分可以提供解决方案。就我遇到的问题而言,涉及两个表,一个子弹,这包含要点,我想复制它们。第二个表是主表,它包含产品数据,例如产品代码和与产品代码关联的产品组代码。
我希望通过以下方式在项目符号表中创建新记录:
这意味着将在bulets表中添加81 x 4个新记录。
注意我正在使用LibreOffice Base,表单和宏来与MySQL合作。
我做了什么
我已经解决了我可以使用以下语句进行一对一复制:
INSERT INTO bullets (product_code, bullet_text) SELECT 'fromCode', bullet_text
FROM bullets WHERE product_code = 'toCode'
其中fromCode和toCode由LibreOffice Base表单提供,并使用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)
我很确定问题是我的知识有限,我仔细阅读了Roland Boumans博客上复制的代码,但我必须遗漏一些东西。看起来我的代码不是通过循环迭代但我不知道为什么。
答案 0 :(得分:0)
如果我理解正确,您需要的是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 演示。