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

La procedura per scorrere una stringa separata da virgole non funziona

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