Може би тази публикация е твърде стара, но опитах кода, представен от Devart, и той не работи за мен.
С малко модификации, тази версия работи за мен:
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 ;
Обяснения:
1) Защо "+2" В SET SubStrLen = CHAR_LENGTH(SUBSTRING_INDEX(strIDs, ',', 1)) + 2;
Когато изпълните функцията MID на следващия ред, индексът на низа започва с 1. Ако имате следния низ '4500,2', с версията на Devart, MID изглежда като MID('4500,2',4,6), което е връщане ',2'.
Така че, ако добавите 1 към дължината на подниза, вие сте на разделителя. Не е достатъчно. Така че добавяте дължината на разделителя. Сега е добре.
2) Защо IF strIDs = '' THEN
в състояние на цикъл?
Защото, когато правите MID, вие връщате низ, дори ако този низ е празен.
Процедурата Devart е закърпена! Благодаря много за отговора :)