Я исправил код с помощью ответа, указанного в переполнении стека. Я хочу перебрать строку идентификаторов, разделенных запятыми, но не могу этого сделать. Приведенная ниже процедура обновляет только первую запись и не обновляет другие записи. Какие исправления необходимы, чтобы я мог перебирать строку, разделенную запятыми. Это код для моего SP
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 = LENGTH(strIDs);
UPDATE TestTable SET status = 'C' WHERE Id = SUBSTRING_INDEX(strIDs, ',', 1);
SET SubStrLen = LENGTH(SUBSTRING_INDEX(strIDs, ',', 1));
SET strIDs = MID(strIDs, SubStrLen, strLen);
IF strIDs = NULL THEN
LEAVE do_this;
END IF;
END LOOP do_this;
END
Код такой, как предоставлен в ответах на этот пост.
Я пробовал использовать функцию find_in_set (), но она работает, только если я передаю идентификаторы с самого начала и не работает, если я передаю идентификаторы случайным образом. Это мой сценарий для таблицы
CREATE TABLE `testtable` (
Id
int (11) DEFAULT NULL,
Status
varchar (255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;
-- ----------------------------
-- Records of testtable
-- ----------------------------
INSERT INTO `testtable` VALUES ('1', 'O');
INSERT INTO `testtable` VALUES ('2', 'O');
INSERT INTO `testtable` VALUES ('3', 'O');
INSERT INTO `testtable` VALUES ('4', 'O');
INSERT INTO `testtable` VALUES ('5', 'O');
Это сохраненный процедура BEGIN UPDATE TestTable SET status = 'C' WHERE Id = FIND_IN_SET (Id, strIDs); END
strIds - это тип varchar.
Теперь попробуйте @ strIDs = '2'