2016-01-15 4 views
0

У меня есть пакет, который выполняющий различные вставки и обновления для положения работы и местонахождения tables.Something как:Откат весь блок во время выполнения остальных в PLSQL

Create or replace package body pack_name 
as 
procedure proc 
as 

----Posistion Block 

Begin 

    Begin 

    insert into xx_pos_table 
    select * 
    from xx_i_pos_table; 

    exception when others then 
    end; 

    Begin 

    insert into xx_pos_tl_table 
    select * from xx_i_pos_tl_table; 

    exception when others then 
    end; 

    Begin 

    Update xx_pos_extra 
    set err_msg =Null 

    exception when others then 
    end; 

end; 

---Job block 
    Begin 

    Update xx_job_extra 
    set err_msg =Null 

    exception when others then 
    end; 

-- Loc block 
    Begin 

    Update xx_loc_extra 
    set err_msg =Null 

    exception when others then 
    end; 
end; 
end; 

Теперь я хочу, что если в позиции блока для Например, есть ошибка при вставке данных в xx_pos_extra, тогда только кадр позиции должен быть откат, а данные из xx_pos_table, xx_pos_tl_table и xx_pos_extra не должны вводиться. Но остальные блоки (Job и location) должны быть выполнены.

+0

я не получил вас. Вы сказали, что * данные из xx_pos_table, xx_pos_tl_table и xx_pos_extra не должны вводиться * и в то же время * Но остальные блоки должны быть выполнены *. Являются ли вставки 'xx_pos_tl_table' и' xx_pos_extra' не * остальными блоками *? –

+0

@ agent5566-Спасибо за исправление ... Я отредактировал свой вопрос. Я хочу, чтобы работа и блок позиции выполнялись. Xx_job_extra и xx_location должны быть обновлены. –

+2

Вы должны просто поместить свой позиционный блок в 'SAVEPOINT' и откат к нему в блоке исключений –

ответ

3

Создать точку сохранения в rollback to, если исключение происходит так:

---Job block 

    begin 
    SAVEPOINT p_rollback; 
     Update xx_job_extra 
     set err_msg =Null 

    exception when others then 
     rollback to p_rollback; 
    end; 

-- Loc block