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