Może ten post jest trochę za stary, ale wypróbowałem kod przedstawiony przez Devart i nie działa dla mnie.
Z kilkoma modyfikacjami ta wersja działa dla mnie :
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 ;
Wyjaśnienia:
1) Dlaczego "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Kiedy wykonujesz funkcję MID w następnym wierszu, indeks ciągu zaczyna się od 1. Jeśli masz następujący ciąg „4500,2”, w wersji Devart, MID Wygląda jak MID('4500,2',4,6), który zwraca ',2'.
Więc jeśli dodasz 1 do długości podciągu, jesteś na ograniczniku. To nie wystarczy. Więc dodajesz długość ogranicznika. Teraz jest dobrze.
2) Dlaczego IF strIDs = '' THEN
w stanie pętli?
Ponieważ kiedy robisz MID, zwracasz ciąg, nawet jeśli ten ciąg jest pusty.
Procedura Devart jest załatana ! Bardzo dziękuję za odpowiedź :)