Возможно, этот пост слишком старый, но я попробовал код, представленный 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" IN 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процедура залатана!Большое спасибо за ваш ответ:)