对于我编写的MySQL存储过程的帮助,我将不胜感激。它在Windows上的MySQL 5.6.11上运行,我已经阅读并重新阅读了MySQL文档,并进行了许多Google搜索。
背景
我有用于存储与产品关联的信息的数据库,在某些情况下,我想通过从一个产品记录复制并插入另一个产品记录,或者从一个产品记录复制并插入到特定产品组中的所有产品记录来创建新的关联信息。我可以从一个产品记录成功复制并插入另一个产品记录,但是从一个产品记录复制然后再插入特定产品组中的所有产品记录时遇到麻烦。
初步研究表明,将游标作为存储过程的一部分可能会提供解决方案。关于这个问题,我涉及两个表,一个项目符号,其中包含项目符号要点,我想复制它们。第二个表是主表,它包含产品数据,例如产品代码和与该产品代码关联的产品组代码。
我希望通过以下方式在项目符号表中创建新记录:
这意味着将有81 x 4个新记录添加到bulets表中。
注意我正在使用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博客上的重复代码,但我一定会漏掉一些东西。看来我的代码没有遍历循环,但我不知道为什么。
如果我理解正确的话,你就是CROSS JOIN。尝试
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 演示。