Peut-être que ce post est un peu trop vieux mais j'ai essayé le code présenté par Devart et ça ne marche pas pour moi.
Avec quelques modifications, cette version fonctionne pour moi :
DELIMITER $$
CREATE PROCEDURE procedure1(IN strIDs VARCHAR(255))
BEGIN
DECLARE strLen INT DEFAULT 0;
DECLARE SubStrLen INT DEFAULT 0;
IF strIDs IS NULL THEN
SET strIDs = '';
END IF;
do_this:
LOOP
SET strLen = CHAR_LENGTH(strIDs);
UPDATE TestTable SET status = 'C' WHERE Id = SUBSTRING_INDEX(strIDs, ',', 1);
SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
SET strIDs = MID(strIDs, SubStrLen, strLen);
IF strIDs = '' THEN
LEAVE do_this;
END IF;
END LOOP do_this;
END
$$
DELIMITER ;
Explications :
1) Pourquoi "+2" DANS SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Lorsque vous exécutez la fonction MID sur la ligne suivante, l'index de chaîne commence par 1. Si vous avez la chaîne suivante '4500,2', avec la version Devart, MID Ressemble à MID('4500,2',4,6) qui est le retour ',2'.
Donc, si vous ajoutez 1 à la longueur de la sous-chaîne, vous êtes sur le délimiteur. Ce n'est pas suffisant. Vous ajoutez donc la longueur du délimiteur. Maintenant c'est bon.
2) Pourquoi IF strIDs = '' THEN
dans la condition de boucle ?
Parce que quand vous faites MID vous retournez une chaîne même si cette chaîne est vide.
La procédure Devart est patchée ! Merci beaucoup pour votre réponse :)