sql >> Database >  >> RDS >> Mysql

Procedure om door komma's gescheiden string te doorlopen werkt niet

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



  1. php - mysql slaat oude gegevens op

  2. Retourneer alle rijen van een specifieke partitie in SQL Server (T-SQL)

  3. Vind en vervang de volledige mysql-database

  4. MySQL:Hoe voorkom je dat een gebruiker zelfs maar ziet dat ik andere DB's heb en hoe je selecte toegang verleent tot één weergave op één DB?