2

我已经创建了一个 mysql 程序。这里是它的代码

BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a , b, d TEXT;
  DECLARE c INT Default 0;
  DECLARE cur1 CURSOR FOR SELECT id, school_id  FROM my_list;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN cur1;
  read_loop: LOOP
    FETCH cur1 INTO a, b;
    IF done THEN
      LEAVE read_loop;
    END IF;
     insertSchool: LOOP  
         SET c = c + 1;
         d = SUBSTRING_INDEX(b, ',', c);
       IF d = "" THEN
          LEAVE insertSchool;
       END IF;      
        INSERT INTO my_school (my_id, school_id) VALUES (a,b);
    END LOOP insertSchool;
  END LOOP;
  CLOSE cur1;
END

在此 cur1 中有 school_id 作为字符串,它包含以逗号分隔的学校 ID。我想拆分这些 id 并存储在不同的表中。但是这一行 d = SUBSTRING_INDEX(b, ',', c); 显示错误。谁能提供解决方案如何在程序中使用 SUBSTRING_INDEX?

4

1 回答 1

5

您的直接问题不是缺少,SUBSTRING_INDEX而是缺少SET

改变

d = SUBSTRING_INDEX(b, ',', c);

SET d = SUBSTRING_INDEX(b, ',', c);
^^^


现在这将解决语法错误,但您需要对代码进行相当多的更改才能使其正常工作。

要从列表中获取第 n 个元素,您需要应用SUBSTRING_INDEX()两次

SUBSTRING_INDEX(SUBSTRING_INDEX(list, ',', n), ',', -1)

话虽如此,您的 SP 可能看起来像

DELIMITER $$
CREATE PROCEDURE my_sp()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a, b, d VARCHAR(12);
  DECLARE c, m INT DEFAULT 0;

  DECLARE cur1 CURSOR FOR SELECT id, school_id  FROM my_list;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO a, b;
    IF done THEN LEAVE read_loop; END IF;
    SET c = 0;
    SET m = CHAR_LENGTH(b) - CHAR_LENGTH(REPLACE(b, ',', ''));

    insertSchool: LOOP
       SET c = c + 1;
       IF c > m + 1 THEN LEAVE insertSchool; END IF;
       SET d = SUBSTRING_INDEX(SUBSTRING_INDEX(b, ',', c), ',', -1);
       INSERT INTO my_school (my_id, school_id) VALUES (a, d);
    END LOOP insertSchool;

  END LOOP;
  CLOSE cur1;
END$$
DELIMITER ;

这是SQLFiddle演示

于 2013-08-09T05:38:20.567 回答