一尘不染

通过逗号分隔的字符串循环的程序不起作用

mysql

我已经在堆栈溢出中给出的答案的帮助下更正了代码。我想循环通过逗号分隔的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;

-- ----------------------------
-- 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’


阅读 260

收藏
2020-05-17

共1个答案

一尘不染

试试这个(语法错误是固定的,没有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语句。

2020-05-17