在plsql中执行其余操作时回滚整个块

时间:2016-01-15 15:33:27

标签: plsql oracle-sqldeveloper rollback

我有一个包正在为作业位置和位置表执行不同的插入和更新。例如:

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的数据。但是应该执行其余的块(作业和位置)。

1 个答案:

答案 0 :(得分: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