sql >> Database teknologi >  >> RDS >> Mysql

Proceduren for at sløjfe gennem kommasepareret streng virker ikke

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



  1. Sådan fungerer TO_DAYS() i MariaDB

  2. Hvordan sletter man hver tabel i et bestemt skema i postgres?

  3. Hvad er MySQL-alternativet til Oracles NEXT_DAY-funktion?

  4. Komplet brugerregistreringssystem ved hjælp af PHP og MySQL database