gpt4 book ai didi

mysql - 在存储过程中遍历表的所有行时出现语法错误

转载 作者:行者123 更新时间:2023-11-29 04:45:00 24 4
gpt4 key购买 nike

在这个问题的已接受答案中 How can I loop through all rows of a table? (MySQL)发布了以下代码:

INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A LIMIT i,1;

我想先从 table_A 中选择变量,以便我可以像这样重用它:

SELECT VAL FROM table_A INTO variableVal LIMIT i, 1;
INSERT INTO table_B(ID, VAL) VALUES(ID, variableVal);

但这给了我一个语法错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT i, 1;

完整代码如下

DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;
CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE factionCount INT DEFAULT 0;
DECLARE factionName varchar(100);
SELECT COUNT(*) FROM faction INTO factionCount;

SET i = 0;
WHILE i < factionCount DO
SELECT name FROM faction INTO factionName LIMIT i, 1;
//SELECT name FROM faction LIMIT i, 1 INTO factionName; (doesn't work either)

INSERT INTO groups_group(name) values (factionName);

//going to do something else with factionName
SET i = i + 1;
END WHILE;
End;
;;

call ROWPERROW();

最佳答案

您的直接错误是由于您的 SELECT INTO语法错误。 INTO 子句应该放在 FROM 之前。

您的过程的句法正确版本可能如下所示

DELIMITER $$
CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE factionCount INT DEFAULT 0;
DECLARE factionName varchar(100);
SELECT COUNT(*) INTO factionCount FROM faction ;

SET i = 0;
WHILE i < factionCount DO
SELECT name INTO factionName FROM faction LIMIT i, 1;
INSERT INTO groups_group(name) VALUES (factionName);

-- going to do something else with factionName
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;

这是 SQLFiddle 演示

现在,尽管这在技术上可行并且可行,但我强烈反对您以这种方式处理您的数据。

  1. 根本不要使用LOOP。如果另一个 session 在您的程序运行时删除了几行,您的代码将会中断。

  2. 如果您希望逐行处理,至少使用游标。

  3. 如果您可以使用数据集方法表达您的处理(并且在大多数情况下您可以),请远离游标。


带有光标的版本可能看起来像

DELIMITER$$
CREATE PROCEDURE ROWPERROW2()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE factionName varchar(100);
DECLARE cursor1 CURSOR FOR SELECT name FROM faction;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cursor1;

read_loop: LOOP
FETCH cursor1 INTO factionName;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO groups_group(name) VALUES (factionName);

-- going to do something else with factionName
END LOOP;

CLOSE cursor1;
END$$
DELIMITER ;

这是 SQLFiddle 演示

关于mysql - 在存储过程中遍历表的所有行时出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20587154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com