2017-10-14 11 views
0

Je le format suivant d'être accepté dans ma procédure stockéeBriser une chaîne de procédure stockée dans la table temporaire mysql

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

donc je voudrais l'accepter et l'insérer dans une table temporaire comme

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

j'ai donc la procédure stockée suivante accepter cela, mais je me bats pour le casser dans les parties (nouveau à MySQL)

tiré d'un exemple ici Split a string and loop through values in MySql Procedure une d étant le modifier un peu

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

* "Pris d'un exemple" * [en effet] (https://stackoverflow.com/a/37231257/1695906). S'il vous plaît n'oubliez pas de fournir l'attribution. –

+0

oui, j'ai ajouté l'attribution maintenant - merci – jedgard

+0

Merci. Ce qui est amusant, ici, c'est que ma première pensée a été "J'ai répondu à une question très similaire, une fois ..." –

Répondre

1

Vous avez trouvé un exemple décent pour le faire (si je ne dis moi-même), bien qu'en principe, SQL est quelque chose d'un endroit difficile à faire. Séparer une chaîne et faire des insertions est plus facile dans un langage procédural avec un support regex facile, comme Perl. Mais parfois, il est logique de faire des choses dans la base de données. La différence importante dans ce que vous faites et ce que ce code a été écrit pour accomplir est que vous devez faire une opération splittin deux fois - imbriquée. Après avoir séparé les paires clé/valeur, vous devez ensuite séparer la clé de la liste des valeurs, puis utiliser plus de division pour chaque ensemble de valeurs séparées par des virgules.

Depuis _value contient maintenant hat=blue,yellow, vous pouvez diviser encore la clé de la liste des valeurs, avec SUBSTRING_INDEX(_value,'=',1) pour la clé et SUBSTRING_INDEX(_value,'=',-1) pour la liste des valeurs.

Vous êtes bloqué là où vous êtes, car vous avez encore besoin de changer cette liste de valeurs séparées par des virgules en quelque chose d'itératif, de faire les insertions ... de sorte que vous pouvez modifier ce code assez largement ... ou vous pourriez juste appelez une seconde copie de ce code, dans une seconde procédure, modifiée pour accepter la liste des clés et des valeurs extraites, divisez la liste des valeurs sur les virgules et effectuez les insertions. La deuxième copie de la procédure ne créera pas la table temporaire, car elle existe déjà.

De plus, étant donné que la première copie de la procédure ne recherche pas ,, mais plutôt pour :=:, vous devrez le modifier pour supprimer le nombre de caractères correct au fur et à mesure qu'il parcourt la chaîne.

Modifier cette ...

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

... à cette ...

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

... parce que votre delimiter est de 3 caractères, plutôt que 1, comme dans l'original exemple, et c'est ce que fait cette ligne - supprime la valeur que vous venez d'insérer, et le délimiteur qui la suit.