我已经在堆栈溢出中给出的答案的帮助下更正了代码。我想循环通过逗号分隔的Id字符串,但无法这样做。下面给出的过程仅更新第一条记录,而不更新其他记录。需要进行哪些更正,才能循环通过逗号分隔的字符串。这是我的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()函数,但仅当我从头开始传递id时才起作用,而如果我随机传递id则不起作用。这是我的表格脚本
CREATE TABLE `testtable` (
Idint(11)DEFAULT NULL, Statusvarchar(255)COLLATE utf8_unicode_ci DEFAULT NULL)ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;
Id
Status
-- ---------------------------- -- 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); 结束
strIds是varchar类型。
现在尝试@ strIDs =‘2’
试试这个(语法错误是固定的,没有CAST功能)-
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 = 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 $$ DELIMITER ;
您可以使用Debugger for MySQL调试过程。
编辑2:
我会不做任何程序。尝试使用FIND_IN_SET函数,例如-
SET @strIDs = '1,2,3'; -- your id values UPDATE TestTable SET status = 'C' WHERE FIND_IN_SET(id, @strIDs);
或创建一个临时文件。表,将其填充id值,然后将这两个表加入UPDATE语句。
id