Vielleicht ist dieser Beitrag etwas zu alt, aber ich habe den von Devart präsentierten Code ausprobiert und er funktioniert bei mir nicht.
Mit wenigen Änderungen funktioniert diese Version für mich:
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 ;
Erläuterungen:
1) Warum "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Wenn Sie die MID-Funktion in der nächsten Zeile ausführen, beginnt der String-Index mit 1. Wenn Sie den folgenden String '4500,2' haben, sieht MID bei der Devart-Version aus wie MID('4500,2',4,6). ist Rückgabe ',2'.
Wenn Sie also 1 bei der Länge des Teilstrings hinzufügen, befinden Sie sich auf dem Trennzeichen. Es ist nicht genug. Also fügen Sie die Länge des Trennzeichens hinzu. Jetzt ist es gut.
2) Warum IF strIDs = '' THEN
im Schleifenzustand?
Denn wenn Sie MID machen, geben Sie einen String zurück, auch wenn dieser String leer ist.
Devart-Prozeduren sind gepatcht ! Vielen Dank für deine Antwort :)