2017-10-14 98 views
0

我有以下格式被接纳进入我的存储过程打破存储过程中串入临时表中的MySQL

hat=blue,yellow:=:jacket=leather,jean:=:shoes=nike,puma,umbro,converse 

所以我愿意接受这一点,并把它插入到一个临时表作为

product | inventory 
------------------- 
hat  | blue 
------------------- 
hat  | yellow 
------------------- 
jacket | leather 
------------------- 
jacket | jean 
------------------- 
shoes | nike 
------------------- 
shoes | puma 
------------------- 
shoes | umbro 
------------------- 
shoes | converse 
------------------- 

所以我有以下存储过程接受这一点,但我努力将其分解成部分(新的到mysql)

这里举一个例子Split a string and loop through values in MySql Procedure d为修改它有点

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `inventoryHandle` $$ 
CREATE PROCEDURE `inventoryHandle`(_list MEDIUMTEXT) 
BEGIN 

DECLARE _next TEXT DEFAULT NULL; 
DECLARE _nextlen INT DEFAULT NULL; 
DECLARE _value TEXT DEFAULT NULL; 

CREATE TEMPORARY TABLE productInventory (
    product VARCHAR(50) NOT NULL 
    , inventory VARCHAR(50) NOT NULL 
); 

iterator: 
LOOP 
    IF LENGTH(TRIM(_list)) = 0 OR _list IS NULL THEN 
    LEAVE iterator; 
    END IF; 

    SET _next = SUBSTRING_INDEX(_list,':=:',1); -- gets me the hats=blue,yellow string 
    SET _nextlen = LENGTH(_next); 
    SET _value = TRIM(_next); 

    INSERT INTO productInventory (product, inventory) VALUES (***); -- not sure how to handle here 
    SET _list = INSERT(_list,1,_nextlen + 1,''); 
END LOOP; 

END $$ 

DELIMITER ; 
+0

*“采取示例”* [确实](https://stackoverflow.com/a/372​​31257/1695906)。请记得提供归属地。 –

+0

是的,我现在添加了归属地 - 谢谢 – jedgard

+0

谢谢。这里有趣的是,我的第一个想法是“我回答了一个非常类似的问题,曾经......” –

回答

1

你已经找到了这样一个体面的例子(如果我不这样说我自己),虽然原则上,SQL是一个尴尬的地方,做了什么。分割字符串和插入操作在程序语言中更容易,并且易于使用正则表达式支持,如Perl。但有时在数据库中做事情是有道理的。

你在做什么和写这个代码是为了完成什么的重要区别是你需要做两次splittin操作 - 嵌套。分割键/值对后,您需要将键与值列表分开,然后对每组逗号分隔值使用更多分割。

由于_value现在包含hat=blue,yellow,您可以进一步拆分从值列表中的关键,与SUBSTRING_INDEX(_value,'=',1)密钥和SUBSTRING_INDEX(_value,'=',-1)的值列表。

由于您仍然需要将该逗号分隔的值列表更改为可迭代的值来执行插入,所以您可以相当广泛地修改此代码......或者您可以在第二个过程中调用此代码的第二个副本,将其修改为接受提取的键和值列表,将逗号分隔值列表并执行插入操作。该过程的第二个副本不会创建临时表,因为它已经存在。

另外,由于该过程的第一个副本不是查找,,而是查找:=:,因此您需要对其进行修改,以便在走过字符串时删除正确数量的字符。

改变了...

SET _list = INSERT(_list,1,_nextlen + 1,''); 

...这个...

SET _list = INSERT(_list,1,_nextlen + 3,''); 

...因为你的分隔符是长3个字符,而不是1,作为原例如,这就是这条线的作用 - 删除你刚才插入的值和它后面的分隔符。