Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die Prozedur zum Durchschleifen einer kommagetrennten Zeichenfolge funktioniert nicht

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 :)