Možná je tento příspěvek příliš starý, ale zkusil jsem kód předložený Devartem a nefunguje mi.
S malými úpravami mi tato verze funguje:
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 ;
Vysvětlení:
1) Proč "+2" V SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Když spustíte funkci MID na dalším řádku, index řetězce začíná 1. Pokud máte následující řetězec '4500,2' s verzí Devart, MID vypadá jako MID('4500,2',4,6), což je návrat ',2'.
Takže pokud přidáte 1 k délce podřetězce, jste na oddělovači. To nestačí. Takže přidáte délku oddělovače. Teď je to dobré.
2) Proč IF strIDs = '' THEN
ve stavu smyčky?
Protože když uděláte MID, vrátíte řetězec, i když je tento řetězec prázdný.
Postup Devart je opraven! Moc děkuji za odpověď :)