在 MySQL 中声明游标时出现错误代码 #1064
error code #1064 while Declaring Cursor in MySQL
这是我第一次在 MySQL 上使用游标,我遇到了一些问题,它不接受我的游标声明,我的代码有什么问题?它向我显示此错误消息:
#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 'DECLARE @MyCursor CURSOR' at line 1
我的代码是:
DECLARE @MyCursor CURSOR;
DECLARE @MyField varchar2(255);
BEGIN
SET @MyCursor = CURSOR FOR
SELECT codeMaint from affectationmc where iduser=29;
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
delete from mcorr where codemaint=@MyField ;
FETCH NEXT FROM @MyCursor
INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
这是我用于游标的模板。它只是从 select 中获取项目并将它们映射到顶部声明的变量并执行您的语句。一旦它处理了 --Actions to Loop Here 部分中的语句,它就会通过 selecting 您的 select 语句的下一行来更改变量。重复此操作,直到它处理 select.
中的所有行
DECLARE
@variable_A AS varchar(15)
,@variable_B AS INT
,@variable_C AS INT
,@variable_D AS VARCHAR(255)
DECLARE Process_Name CURSOR LOCAL FAST_FORWARD FOR
SELECT
T.Col_A,T.Col_B,T.Col_C,T.Col_D
FROM
tab.my_table AS T;
OPEN Process_Name
FETCH NEXT FROM Process_Name INTO @variable_A,@variable_B,@variable_C,@variable_D
WHILE @@FETCH_STATUS = 0
BEGIN
--Actions to Loop Here
FETCH NEXT FROM Process_Name INTO @variable_A,@variable_B,@variable_C,@variable_D
END
CLOSE Process_Name
DEALLOCATE Process_Name
您试图在一个语句中声明游标,然后在第二个语句中将查询与其相关联。虽然有些数据库允许这样做,但我很确定 MySQL 不是其中之一。此外,MySQL 非常严格,直到 在 声明所有变量之后才声明游标。
以下是我的做法:
BEGIN -- note all declarations are inside the BEGIN/END
DECLARE done INT DEFAULT FALSE; -- Good practice is to avoid global variables whenever possible
DECLARE MyField varchar(255); -- varchar2 is Oracle, not MySQL
DECLARE MyCursor CURSOR FOR
SELECT codeMaint
FROM affectationmc
WHERE iduser = 29;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET done = TRUE; -- this will detect end-of-result-set
OPEN MyCursor;
read_loop: LOOP
FETCH NEXT
FROM MyCursor
INTO MyField;
IF done THEN
LEAVE read_loop;
END IF;
DELETE FROM mcorr
WHERE codemaint = MyField ;
END LOOP;
CLOSE MyCursor;
END;
这是我第一次在 MySQL 上使用游标,我遇到了一些问题,它不接受我的游标声明,我的代码有什么问题?它向我显示此错误消息:
#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 'DECLARE @MyCursor CURSOR' at line 1
我的代码是:
DECLARE @MyCursor CURSOR;
DECLARE @MyField varchar2(255);
BEGIN
SET @MyCursor = CURSOR FOR
SELECT codeMaint from affectationmc where iduser=29;
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
delete from mcorr where codemaint=@MyField ;
FETCH NEXT FROM @MyCursor
INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
这是我用于游标的模板。它只是从 select 中获取项目并将它们映射到顶部声明的变量并执行您的语句。一旦它处理了 --Actions to Loop Here 部分中的语句,它就会通过 selecting 您的 select 语句的下一行来更改变量。重复此操作,直到它处理 select.
中的所有行DECLARE
@variable_A AS varchar(15)
,@variable_B AS INT
,@variable_C AS INT
,@variable_D AS VARCHAR(255)
DECLARE Process_Name CURSOR LOCAL FAST_FORWARD FOR
SELECT
T.Col_A,T.Col_B,T.Col_C,T.Col_D
FROM
tab.my_table AS T;
OPEN Process_Name
FETCH NEXT FROM Process_Name INTO @variable_A,@variable_B,@variable_C,@variable_D
WHILE @@FETCH_STATUS = 0
BEGIN
--Actions to Loop Here
FETCH NEXT FROM Process_Name INTO @variable_A,@variable_B,@variable_C,@variable_D
END
CLOSE Process_Name
DEALLOCATE Process_Name
您试图在一个语句中声明游标,然后在第二个语句中将查询与其相关联。虽然有些数据库允许这样做,但我很确定 MySQL 不是其中之一。此外,MySQL 非常严格,直到 在 声明所有变量之后才声明游标。
以下是我的做法:
BEGIN -- note all declarations are inside the BEGIN/END
DECLARE done INT DEFAULT FALSE; -- Good practice is to avoid global variables whenever possible
DECLARE MyField varchar(255); -- varchar2 is Oracle, not MySQL
DECLARE MyCursor CURSOR FOR
SELECT codeMaint
FROM affectationmc
WHERE iduser = 29;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET done = TRUE; -- this will detect end-of-result-set
OPEN MyCursor;
read_loop: LOOP
FETCH NEXT
FROM MyCursor
INTO MyField;
IF done THEN
LEAVE read_loop;
END IF;
DELETE FROM mcorr
WHERE codemaint = MyField ;
END LOOP;
CLOSE MyCursor;
END;