现在有一张表,我希望根据一定条件把符合的记录找出来并删除。
比如
delete from table where 。。
但是可能符合条件的记录有100万条,考虑到oracle可能无法一次提交这么多数据的删除,我又希望能分批删除,比如10万条,10万条的删除,分10次删除100万条。
各位达人有什么好方法达到这个目的

解决方案 »

  1.   

    举个例子以下过程一条一条记录修改,100000条commit一次,避免所有记录一起修改引起的回滚段不足;并且在过程运行如果遇到什么错误而终止,也已经有一部分数据已经修改成功,再次运行时只需要修改剩下的记录,避免了一起修改时万一出错就前功尽弃的问题。
    declare
    v_rowcount number;
    begin
       loop
         update T_CARCASE_CAR 
            set CREATED_BY = user,CREATED_DATE=sysdate,UPDATED_BY=user,UPDATED_DATE=sysdate
          where CREATED_BY=null or CREATED_DATE=null or UPDATED_BY=null or UPDATED_DATE=null
            and rownum<100001;
          v_rowcount:=sql%rowcount;      
          commit;   
         exit when v_rowcount<100000;    --  当sql返回的记录数<100000时,说明已经是最后一次循环了,符合exit出循环的条件了
       end loop;  
    end;
    /
      

  2.   

    谢谢楼上的回答
    一个个的update,计数到10000就commit1次,可是这个应该不符合批处理的要求,我希望的是一块块的批处理掉,而这一块块又是一大块里的。
      

  3.   

    怎么不符合?
    10万条记录update一次