MySQL - удалить в хранимой процедуре с курсором - PullRequest
0 голосов
/ 15 октября 2018

Я создаю хранимую процедуру, содержащую оператор удаления и использование курсора.Проблема в том, что я не могу использовать эти два вместе.

Вот отдельное 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

Пожалуйста, помогите мне решить проблему.

1 Ответ

0 голосов
/ 15 октября 2018

В документации явно не указывается это, но я вполне уверен, что никакие запросы не могут предшествовать объявлению курсора.

Вы должны быть в состоянии выполнить это УДАЛЕНИЕ после того, как CURSOR объявлен как DECLAREd, но до того, как он будет открыт..

...