MySQL - 使用光标在存储过程中删除



我正在创建一个包含删除语句和游标用法的存储过程。问题是我不能同时使用这两者。

这是一个独立的MWE。 请注意,块 1 和块 2 可以单独运行(如果我评论另一个(,但不能一起运行。

drop table if exists T1;
create table T1(f1 int, f2 int);
insert into T1 values(1, 1);
insert into T1 values(2, 2);
insert into T1 values(3, 3);
drop table if exists T2;
create table T2(f3 int, f4 int);
insert into T2 values(1, 11);
insert into T2 values(2, 22);
insert into T2 values(3, 33);

drop procedure if exists proc1;
DELIMITER //
CREATE PROCEDURE proc1(inputValue int)
BEGIN
declare i int;
declare cursorSize int;
declare anF1 int;
declare anF2 int;
-- Block 1 - Begin:    
delete from T2 where f3 = inputValue;
-- Block 1 - End.    

-- Block 2 - Begin:    
declare cur1 cursor for 
select f1, f2  
from T1
where f1 <= inputValue;
open cur1;
select FOUND_ROWS() into cursorSize;
if (cursorSize > 0) then
set i = 0;
while i < cursorSize DO
fetch cur1 into anF1, anF2;
insert into T2 values(anF1, anF2);
set i = i + 1;
end while;
end if;
close cur1;
-- Block 2 - End.    

END //
DELIMITER ;
call proc1(3);

如果我取消注释块 1 中的 delete 语句,则会收到此错误:

1064 - 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解要在附近使用的正确语法

'declare cur1 cursor for 
select f1, f2  
from T1
where f1 <=' at line 10

请帮我解决问题。

文档似乎没有明确说明它,但我相当确定游标声明之前没有查询。

您应该能够在声明 CURSOR 之后但在打开 CURSOR 之前执行该 DELETE。

最新更新