执行存储过程del_tab时出现下面的错误 
BEGIN del_tab; END; 

ERROR 位于第 1 行: 
ORA-01555: 快照过旧: 回退段号 7 在名称为 "_SYSSMU7$" 过小 
ORA-06512: 在"LICHENG.DEL_TAB", line 5 
ORA-06512: 在line 1 存储过程内容为: 
create or replace procedure del_tab is 
cursor mycur is 
  select clbh from xxfl where jgsj <=add_months(sysdate,-1); 
begin 
for var_clbh in mycur loop 
  delete from tpxx where tpid=var_clbh.clbh; 
  delete from xxfl where clbh=var_clbh.clbh; 
  delete from bjxx where clbh=var_clbh.clbh; 
  commit; 
end loop; 
commit; 
end; 执行一次存储过程可能要删除10万-20万张图片

解决方案 »

  1.   

    快照太旧:
    当某一个事务回退数据大于回退段所容纳的数量时,oracle根据回退段的存储参数next进行区扩展,如果所有区的数量等于存储参数maxnextents仍不够用时,则产生"快照太旧"(Snapshot Too Old)错误.所以你在存储过程的循环里要加一个计数值,判断每删除3000笔或更多一些数据时,就要commit一次
      

  2.   

    这个问题我之前也碰到过,就是数据量大太,回滚段不够,可以分批commit
      

  3.   

    看下你的undo表空间是不是太小小的话加大,和undo_retention的值是不是太大大的话缩小,
    估计undo表空间加大一些问题就可以解决。
    或者把
    delete from tpxx where tpid=var_clbh.clbh; 
      delete from xxfl where clbh=var_clbh.clbh; 
      delete from bjxx where clbh=var_clbh.clbh; 
      commit; 
    改为
    delete from tpxx where tpid=var_clbh.clbh; 
    commit;
      delete from xxfl where clbh=var_clbh.clbh; 
    commit;
      delete from bjxx where clbh=var_clbh.clbh; 
      commit; 
    再要不然就像楼上说的,分批吧。
      

  4.   

    当然,除了分批commit外,还要让undo满足你的最大的事务量为准.因此undo 也别太小了.