Mysql
 sql >> Base de données >  >> RDS >> Mysql

La procédure pour parcourir une chaîne séparée par des virgules ne fonctionne pas

Peut-être que ce post est un peu trop vieux mais j'ai essayé le code présenté par Devart et ça ne marche pas pour moi.

Avec quelques modifications, cette version fonctionne pour moi :

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 ;

Explications :

1) Pourquoi "+2" DANS SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;

Lorsque vous exécutez la fonction MID sur la ligne suivante, l'index de chaîne commence par 1. Si vous avez la chaîne suivante '4500,2', avec la version Devart, MID Ressemble à MID('4500,2',4,6) qui est le retour ',2'.

Donc, si vous ajoutez 1 à la longueur de la sous-chaîne, vous êtes sur le délimiteur. Ce n'est pas suffisant. Vous ajoutez donc la longueur du délimiteur. Maintenant c'est bon.

2) Pourquoi IF strIDs = '' THEN dans la condition de boucle ?

Parce que quand vous faites MID vous retournez une chaîne même si cette chaîne est vide.

La procédure Devart est patchée ! Merci beaucoup pour votre réponse :)