Måske er dette indlæg lidt for gammelt, men jeg har prøvet koden præsenteret af Devart, og den virker ikke for mig.
Med få ændringer virker denne version for mig :
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 ;
Forklaringer:
1) Hvorfor "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Når du udfører MID-funktionen på næste linje, begynder strengindeks med 1. Hvis du har følgende streng '4500,2', med Devart-versionen, ser MID ud som MID('4500,2',4,6) som er retur ',2'.
Så hvis du tilføjer 1 ved delstrengens længde, er du på afgrænseren. Det er ikke nok. Så du tilføjer længden af afgrænsningen. Nu er det godt.
2) Hvorfor IF strIDs = '' THEN
i sløjfetilstand?
Fordi når du laver MID returnerer du en streng, selvom denne streng er tom.
Devart-proceduren er rettet! Mange tak for din svar :)