代码之家  ›  专栏  ›  技术社区  ›  Alisa

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

  •  0
  • Alisa  · 技术社区  · 7 年前

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

    这是一个独立的MWE。

    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
    

    请帮我解决这个问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Uueerdo    7 年前

    文档似乎没有显式地声明它,但是我相当肯定在游标声明之前不会有任何查询。

    您应该能够在声明游标之后但在打开游标之前执行删除。