Forse questo post è un po' troppo vecchio ma ho provato il codice presentato da Devart e non funziona per me.
Con poche modifiche, questa versione funziona per me:
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 ;
Spiegazioni:
1) Perché "+2" IN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Quando si esegue la funzione MID sulla riga successiva, l'indice di stringa inizia con 1. Se si dispone della seguente stringa '4500,2', con la versione Devart, MID assomiglia a MID('4500,2',4,6) che è il ritorno ',2'.
Quindi se aggiungi 1 alla lunghezza della sottostringa, sei sul delimitatore. Non è abbastanza. Quindi aggiungi la lunghezza del delimitatore. Ora va bene.
2) Perché IF strIDs = '' THEN
in condizione di ciclo?
Perché quando fai MID restituisci una stringa anche se questa stringa è vuota.
La procedura Devart è stata patchata! Grazie mille per la tua risposta :)