Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O procedimento para percorrer a string separada por vírgulas não está funcionando


Talvez este post seja um pouco antigo, mas eu tentei o código apresentado por Devart e não está funcionando para mim.

Com poucas modificações, esta versão funciona para mim:
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 ;

Explicações:

1) Por que "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;

Quando você executa a função MID na próxima linha, o índice da string começa com 1. Se você tiver a seguinte string '4500,2', com a versão Devart, MID se parece com MID('4500,2',4,6) que é o retorno ',2'.

Portanto, se você adicionar 1 no comprimento da substring, estará no delimitador. Não é suficiente. Então você adiciona o comprimento do delimitador. Agora esta bom.

2) Por que IF strIDs = '' THEN na condição de loop?

Porque quando você faz MID você retorna uma string mesmo que essa string esteja vazia.

O procedimento Devart está corrigido! Muito obrigado pela sua resposta :)