Misschien is dit bericht een beetje te oud, maar ik heb de code van Devart geprobeerd en het werkt niet voor mij.
Met een paar aanpassingen werkt deze versie voor mij:
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 ;
Uitleg:
1) Waarom "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Wanneer u de MID-functie op de volgende regel uitvoert, begint de tekenreeksindex met 1. Als u de volgende tekenreeks '4500,2' heeft, met de Devart-versie, ziet MID eruit als MID('4500,2',4,6) die is retour ',2'.
Dus als je 1 toevoegt aan de lengte van de substring, zit je op het scheidingsteken. Het is niet genoeg. Dus je voegt de lengte van het scheidingsteken toe. Nu is het goed.
2) Waarom IF strIDs = '' THEN
in de lusconditie?
Omdat als je MID doet, je een string teruggeeft, zelfs als deze string leeg is.
Devart-procedure is gepatcht! Heel erg bedankt voor je antwoord :)