我已经创建了一个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?
答案 0 :(得分:4)
您的直接问题不在于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 演示