MySQL Trigger работает только частично - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь реализовать триггер, который переносит несколько записей из 4 разных таблиц в другой набор из 4 таблиц (обозначается суффиксом _history), которые имеют одинаковую схему.

Триггер выглядит следующим образом

DELIMITER //
create trigger shift_to_history
    before update on event_ledger
    for each row
   begin
        declare id,event_id,communication_number,communication_flag,slot_number,room_id,status_level,prev_status_level int default 0;
        declare msg text;
        declare req_date,end_date,start_date date;
        declare purpose varchar(30);
        declare misc_ledger_cursor cursor for select * from misc_ledger where event_id = old.event_id;
        declare resource_communication_cursor cursor for select * from resource_communication where event_id = old.event_id;
        declare slots_and_details_cursor cursor for select * from slots_and_details where event_id = old.event_id;
        declare event_communication_cursor cursor for select * from event_communication where event_id = old.event_id;
        insert into event_ledger_history values(old.event_id,old.event_name,old.description,old.username,old.start_date,old.end_date);
        open misc_ledger_cursor;
        begin
            declare finished int default 0;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
            misc_ledger_transfer: loop
                fetch misc_ledger_cursor into event_id,communication_number,req_date,msg,communication_flag;
                if finished = 1 then
                    leave misc_ledger_transfer;
                end if;
                insert into misc_ledger_history values (event_id,communication_number,req_date,msg,communication_flag);
            end loop misc_ledger_transfer;
        end;
        close misc_ledger_cursor;
        delete from misc_ledger where event_id = old.event_id;


        open resource_communication_cursor;
        begin
            declare finished int default 0;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
            resource_coms_transfer: loop
                fetch resource_communication_cursor into event_id,msg,communication_number,communication_flag;
                if finished = 1 then
                    leave resource_coms_transfer;
                end if;
                insert into resource_communication_history values (event_id,msg,communication_number,communication_flag);
                delete from resource_communication where id = event_id;
            end loop resource_coms_transfer;
        end;
        close resource_communication_cursor;


        open event_communication_cursor;
        begin
            declare finished int default 0;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
            event_coms_transfer: loop
            fetch event_communication_cursor into event_id,msg,communication_number,communication_flag;
            if finished = 1 then
                leave event_coms_transfer;
            end if;
            insert into event_communication_history values (event_id,msg,communication_number,communication_flag);
        end loop event_coms_transfer;
        end;
        close event_communication_cursor;
        delete from event_communication where event_id = old.event_id;


        open slots_and_details_cursor;
        begin
            declare finished int default 0;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
            slots_and_details_transfer: loop
                fetch slots_and_details_cursor into id,event_id,slot_number,room_id,start_date,end_date,status_level,prev_status_level,purpose,msg;
                if finished = 1 then
                    leave slots_and_details_transfer;
                end if;
                insert into slots_and_details_history values (id,event_id,slot_number,room_id,start_date,end_date,status_level,prev_status_level,purpose,msg);
            end loop slots_and_details_transfer;
         end;
        close slots_and_details_cursor;
        delete from slots_and_details where event_id = old.event_id;
    end//

DELIMITER ;

Триггер работает только до

insert into event_ledger_history values(old.event_id,old.event_name,old.description,old.username,old.start_date,old.end_date);

После чего он ничего не делает. Терминал MySQL выдает сообщение об успехе, ножелаемый результат не достигнут. т.е. оставшиеся таблицы истории пока пустые (те, которые используют курсор).

Я сослался на Хранимая процедура MySQL, обрабатывая несколько курсоров и результаты запроса , но не получил благоприятных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...