2017-10-14 103 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,作爲原例如,這就是這條線的作用 - 刪除你剛纔插入的值和它後面的分隔符。