Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Mysql过程中通过字符串循环_Python_Mysql_Stored Procedures - Fatal编程技术网

Python 在Mysql过程中通过字符串循环

Python 在Mysql过程中通过字符串循环,python,mysql,stored-procedures,Python,Mysql,Stored Procedures,我编写了一个存储过程,它以逗号分隔的字符串作为参数。例如:id_list='23,45,8106,9,33'。在这个过程中,我想循环遍历字符串,一次从字符串中提取一个ID,然后从数据库中提取数据。基本上,ID将用于过程中的where条件 所以理想情况下我应该得到这样的身份证 二十三 45 8. 106 9 三十三 我尝试过这样做,但它只是提取第一个id,然后停止 DELIMITER ;; CREATE PROCEDURE `procedure_test`(IN id_list VARCHAR(2

我编写了一个存储过程,它以逗号分隔的字符串作为参数。例如:id_list='23,45,8106,9,33'。在这个过程中,我想循环遍历字符串,一次从字符串中提取一个ID,然后从数据库中提取数据。基本上,ID将用于过程中的where条件

所以理想情况下我应该得到这样的身份证

二十三 45 8. 106 9 三十三

我尝试过这样做,但它只是提取第一个id,然后停止

DELIMITER ;;
CREATE PROCEDURE `procedure_test`(IN id_list VARCHAR(255))
BEGIN
  DECLARE id_length    INT DEFAULT 0;
  DECLARE id_sub_str INT DEFAULT 0;

  IF id_list IS NULL THEN
    SET id_list = '';
  END IF;

do_this:
  LOOP
    SET id_length = LENGTH(id_list);

    SELECT mechanics_name, mechanics_id from `mechanics` WHERE employer_id = SUBSTRING_INDEX(id_list, ',', 1);

    SET id_sub_str = CHAR_LENGTH(SUBSTRING_INDEX(id_list, ',', 1)) + 2;
    SET id_list = MID(id_list, id_sub_str, id_length);

    IF id_list = '' THEN
      LEAVE do_this;
    END IF;
  END LOOP do_this;

END;;
DELIMITER ;
谁能告诉我怎么做。谢谢在我的机器上测试

DELIMITER $$

CREATE PROCEDURE procedurename(IN Param1 VARCHAR(255))
BEGIN
  SET @text := TRIM(BOTH ',' FROM Param1);
  SET @strLen := 0;
  SET @i := 1;

  WHILE @strLen < LENGTH(@text)  DO
    SET @str := SUBSTRING_INDEX(@text, ',', @i);
    SET @strLen := LENGTH(@str);
    SET @i := @i + 1;

    INSERT INTO t VALUES( SUBSTRING_INDEX(@str, ',', -1)); -- Print split value
  END WHILE;
END
$$

DELIMITER ;
然后就叫它

CALL procedurename('23, 45, 8, 106, 9, 33');

SELECT * FROM t

23
45
8
106
9
33

您希望这些结果在哪里?在新表中?或者使用Where employer_id INSELECT blah FROM而不是在新表中插入@str。我可以使用@str的值作为select查询中的Where条件。如从mechanics中选择mechanics\u name、mechanics\u id,其中雇主\u id=子字符串_INDEX@str, ',', -1;@sandeep那么你想加入?如果是,请使用WHERE FIND_IN_SETemployer_id,@str>0是的,我已经用FIND_IN_SET进行了测试。但我不知道为什么它只拉一张唱片。举个例子:如果我通过'23,45,8,106,9,33',它只会拉出机械师的名字和机械师的id为23。这有点奇怪。@sandeep你能在sqlfiddle上重新创建问题吗?找到问题并更正了它。SET@str:=子字符串_INDEX@text",","我,;在逗号后加空格。谢谢米海。
CALL procedurename('23, 45, 8, 106, 9, 33');

SELECT * FROM t

23
45
8
106
9
33