【问题标题】:MySQL - delete in stored procedure with cursorMySQL - 使用游标在存储过程中删除
【发布时间】:2018-10-15 17:25:58
【问题描述】:

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

这是一个独立的 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 中的删除语句,我会收到此错误:

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

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

请帮我解决问题。

【问题讨论】:

    标签: mysql stored-procedures cursor sql-delete


    【解决方案1】:

    文档似乎没有明确说明,但我相当肯定游标声明之前不会有任何查询。

    您应该能够在 CURSOR 被 DECLAREd 之后但在它被 OPENed 之前执行该 DELETE。

    【讨论】:

    • @PaulCampbell 啊,是的,现在我再看一遍,我非常关注光标特定的部分,我忽略了更一般的 DECLARE ... must be ... before any other statements 部分。
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多