分类: Oracle
2008-04-10 09:53:48
来源:赛迪网 作者:Alizze |
简介在实际的工作和学习中,我们需要分步删除数据表的一些记录,分批提交用以减少对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 successfully completed. |