将存储过程字符串分解为临时表mysql

时间:2017-10-14 23:57:51

标签: mysql stored-procedures split

我的存储过程中接受以下格式

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 ;

1 个答案:

答案 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,这就是此行的作用 - 删除刚刚插入的值以及跟随它的分隔符。