当前位置: 首页 > 面试题库 >

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

阚原
2023-03-14
问题内容

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


问题答案:

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



 类似资料:
  • 假设我有一个Unix shell变量,如下所示 我想使用for循环提取所有值(、和),并将每个值传递到过程中。 该脚本应该允许从< code>$variable中提取任意数量的逗号分隔值。

  • 我有以下数组: 我通过foreach循环得到结果: 现在我想用逗号分隔每个输出。有些可能是空的。 我读过php方法,但我不确定在这种情况下如何使用它,或者是否有更好的解决方案。

  • 问题内容: 我有一个像 我想把它分成那些字符串 如果我简单地打电话给我,那么在修剪之后我会得到不同的结果,因为在某些字符串中,例如,仍然有一个逗号。但我不想放在方括号中。有解决这个问题的优雅方法吗? 问题答案: 假设和没有嵌套和未转义。您可以使用以下方式进行拆分: 正则演示 如果逗号后面没有非圆括号和,则将匹配逗号,从而忽略和中的逗号。

  • 问题内容: 我有从.net应用程序A,B,C,D,E,F获取的字符串, 我想写一个SQL选择语句像 这在t-SQL中将不起作用,因为它使用不将值分开的一个字符串。有什么办法可以做到这一点? 问题答案: 它认为最简单的方法是动态SQL生成:

  • 在逗号处划分字符串的最佳方法是什么,这样每个单词都可以成为ArrayList的一个元素? 例如:

  • 问题内容: 如何将逗号分隔的字符串拆分为存储过程中的字符串,并将其插入表字段中? 使用Firebird 2.5 问题答案: 这里有一个示例如何分割字符串并将子字符串写入表中: