我已经通过堆栈溢出中给出的答案纠正了代码。我想遍历逗号分隔的字符串,但不能这样做。下面给出的过程只更新第一条记录而不更新其他记录。需要进行哪些更正才能通过逗号分隔的字符串进行循环。 这是我的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()函数,但它只有在我通过ids从头开始而不工作的情况下才起作用,如果我随机传递Ids。 这是我的表脚本
CREATE TABLE `testtable` (
Id
INT(11)DEFAULT NULL, Status
VARCHAR(255)COLLATE utf8_unicode_ci DEFAULT NULL )ENGINE = MyISAM的默认字符集= 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 SET TestTable的状态= 'C' 其中id = FIND_IN_SET(ID,strIDs); END
strIds是varchar类型。
现在尝试@ strIDs = '2'
它不工作..错误显示在DECLARE StrLen。我正在使用Navicat 8 Lite for MySQl。调试是不可能的 –
@ Devart..Its工作,如果我删除前导和尾DELEMETER,但不循环,如果我通过'1,2,3'作为字符串。我想更新Ids为1,2,3的状态,但它只更新为1 –
我修改了我的答案。 – Devart