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

发表于:2007-06-07来源:作者:点击数: 标签:
如何有条件的分步删除数据表中的记录 作者:eygle 出处: http://blog.eygle.com 日期:February 22, 2005 自己动手,丰衣足食 | Blog首页 有时候我们需要分配删除数据表的一些记录,分批提交以减少对于Undo的使用,本文提供一个简单的存储过程用于实现该逻辑。

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

作者:eygle

出处:http://blog.eygle.com

日期:February 22, 2005

« 自己动手,丰衣足食 | Blog首页


有时候我们需要分配删除数据表的一些记录,分批提交以减少对于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   **      

  7   **/

  8  (

  9    p_TableName    in    varchar2,    -- The TableName which you want to delete from

 10    p_Condition    in    varchar2,    -- Delete condition, such as "id>=100000"

 11    p_Count        in    varchar2     -- 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 suclearcase/" target="_blank" >ccessfully completed.




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

原文转自:http://www.ltesting.net