eygle.com   eygle.com
eygle.com  
 

« 自己动手,丰衣足食 | Blog首页 | Redo allocation latch介绍 »

如何有条件的分步删除数据表中的记录

作者:eygle |【转载时请务必以超链接形式标明文章和作者信息及本声明
链接:
有时候我们需要分配删除数据表的一些记录,分批提交以减少对于Undo的使用,本文提供一个简单的存储过程用于实现该逻辑。
你可以根据你的需要进行适当调整,本例仅供参考:

SQL> create table test as select * from dba_objects;

Table created.

SQL> create or replace procedure deleteTab
  2  /**
  3   ** Usage: run the script to create the proc deleteTab
  4   **        in SQL*PLUS, type "exec deleteTab('Foo','ID>=1000000','3000');"
  5   **        to delete the records in the table "Foo", commit per 3000 records.
  6   **       Condition with default value '1=1' and default Commit batch is 10000.
  7   **/
  8  (
  9    p_TableName    in    varchar2,    -- The TableName which you want to delete from
 10    p_Condition    in    varchar2 default '1=1',    -- Delete condition, such as "id>=100000"
 11    p_Count        in    varchar2 default '10000'    -- Commit after delete How many records
 12  )
 13  as
 14   pragma autonomous_transaction;
 15   n_delete number:=0;
 16  begin
 17   while 1=1 loop
 18     EXECUTE IMMEDIATE
 19       'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
 20     USING p_Count;
 21     if SQL%NOTFOUND then
 22     exit;
 23     else
 24          n_delete:=n_delete + SQL%ROWCOUNT;
 25     end if;
 26     commit;
 27   end loop;
 28   commit;
 29   DBMS_OUTPUT.PUT_LINE('Finished!'); 
 30   DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
 31  end;
 32  /

Procedure created.


SQL> insert into test select * from dba_objects;

6374 rows created.

SQL> /

6374 rows created.

SQL> /

6374 rows created.

SQL> commit;

Commit complete.

SQL> exec deleteTab('TEST','object_id >0','3000')
Finished!
Totally 19107 records deleted!

PL/SQL procedure successfully completed.


很简单,但是想来也有人可以用到。

修正了一下,增加了2个缺省值,完整过程如下:
create or replace procedure deleteTab
(                                                                                                
  p_TableName    in    varchar2,    -- The TableName which you want to delete from               
  p_Condition    in    varchar2 default '1=1',    -- Delete condition, such as "id>=100000"                    
  p_Count        in    varchar2 default '10000'    -- Commit after delete How many records                      
)                                                                                                
as                                                                                               
 pragma autonomous_transaction;                                                                  
 n_delete number:=0;                                                                             
begin                                                                                            
 while 1=1 loop                                                                                  
   EXECUTE IMMEDIATE                                                                             
     'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'                   
   USING p_Count;                                                                                
   if SQL%NOTFOUND then                                                                          
   exit;                                                                                         
   else                                                                                          
        n_delete:=n_delete + SQL%ROWCOUNT;                                                       
   end if;                                                                                       
   commit;                                                                                       
 end loop;                                                                                       
 commit;                                                                                         
 DBMS_OUTPUT.PUT_LINE('Finished!');                                                              
 DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');                       
end;                                                                                             
/                                                                                                

By eygle on 2005-02-22 16:27 | Comments (5) | Posted to HowTo | SQL.PLSQL | Edit |Pageviews:

相关文章 随机文章
  • 如何对时间进行简单加减运算
  • 并行查询并行度Degree与instances 设置
  • 关于PARALLEL_MAX_SERVERS参数的设置
  • 使用REF CURSOR处理Oracle的结果集
  • Oracle Peeking绑定变量的控制
  • 回家之难 难于上青天
    Oracle的初始化参数说明
    首届杰出数据库工程师评选终选时间表
    使用orabm进行CPU压力测试...
    一路向北
    网上相关主题:
    Google

    留言 (5)

    赞一个,最近我就碰到了这个问题。

    Posted by: fans at May 5, 2005 4:48 PM

    删除条件为空时,会出错。呵呵

    Posted by: karson at June 14, 2005 2:13 PM

    条件为空时,可以加个‘1=1’代替。

    Posted by: find_ufo at July 19, 2005 9:47 AM

    修正了一下,增加了2个缺省值.

    Posted by: eygle at November 19, 2005 8:40 PM

    问下老大,为什么要用自治事务呢?

    Posted by: waityou at January 23, 2006 3:47 PM

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004 eygle.com, All rights reserved.