sql >> Base de Datos >  >> RDS >> Mysql

El procedimiento para recorrer cadenas separadas por comas no funciona

Tal vez esta publicación sea demasiado antigua, pero probé el código presentado por Devart y no me funciona.

Con algunas modificaciones, esta versión me funciona:

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 ;

Explicaciones:

1) ¿Por qué "+2" EN SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;

Cuando ejecuta la función MID en la línea siguiente, el índice de cadena comienza con 1. Si tiene la siguiente cadena '4500,2', con la versión de Devart, MID parece MID('4500,2',4,6) que es devolver ',2'.

Entonces, si agrega 1 en la longitud de la subcadena, está en el delimitador. No es suficiente. Entonces agrega la longitud del delimitador. Ahora está bien.

2) Por qué IF strIDs = '' THEN en la condición de bucle?

Porque cuando haces MID, devuelves una cadena incluso si esta cadena está vacía.

¡El procedimiento de Devart está parcheado! Muchas gracias por tu respuesta :)