我的存储过程中接受以下格式
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的示例并稍作修改
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 :(得分: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,这就是此行的作用 - 删除刚刚插入的值以及跟随它的分隔符。