如何有條件的分步刪除數(shù)據(jù)表中的記錄作者:eygle出處:http://blog.eygle.com日期:February 22, 2005
有時候我們需要分配刪除數(shù)據(jù)表的一些記錄,分批提交以減少對于Undo的使用,本文提供一個簡單的存儲過程用于實現(xiàn)該邏輯。
你可以根據(jù)你的需要進(jìn)行適當(dāng)調(diào)整,本例僅供參考:
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 successfully completed.
有時候我們需要分配刪除數(shù)據(jù)表的一些記錄,分批提交以減少對于Undo的使用,本文提供一個簡單的存儲過程用于實現(xiàn)該邏輯。
你可以根據(jù)你的需要進(jìn)行適當(dāng)調(diào)整,本例僅供參考:
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 successfully completed.