如何有条件的分步删除数据表中的记录
来源:互联网 发布:淘宝注册教程视频 编辑:程序博客网 时间:2024/05/16 14:24
有时候我们需要分配删除数据表的一些记录,分批提交以减少对于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(
http://www.eygle.com/archives/2005/02/ecioioaeoeeeioe.html
p_TableName in varchar2,
p_Condition in varchar2 default '1=1',
p_Count in varchar2 default '10000' )
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;
/
- 如何有条件的分步删除数据表中的记录
- 如何有条件的分步删除数据表中的记录
- 如何有条件的查询或删除表中的重复记录
- 如何删除数据表中重复的记录
- 删除数据表中的重复记录
- 删除数据表中的重复记录
- MySql-如何查询删除数据表重复记录
- MySql-如何查询删除数据表重复记录
- 删除SQL2000数据表中的重复记录
- 循环删除大数据表中的记录
- 删除数据表中相同的记录!
- MySQL--数据表删除记录
- mysql删除数据表中的重复记录保留i…
- 操作数据表中的记录
- 如何判断ACCESS数据表中的某条记录是否存在
- 如何删除数据表中的重复数据(各种数据库)
- 如何删除有关连的另一个表中的记录
- SqlServer删除数据表中重复的记录(续)
- Qt 如何 给Widget设置背景图片
- c# using 关键字小结
- XML编程(CRUD)
- web打印时,如何让表格自动分页,且不会折断表格线?
- 编程之美:分层遍历二叉树
- 如何有条件的分步删除数据表中的记录
- 转
- 手机J2ME环境测试程序--测试手机对jsr的支持以及其他信息
- javascript prototype 实现类似OOP继承
- Chrome插件技术开发总结
- In 与Exists的理解
- Flex4 Error #2032 Stream Error的解决方式
- 有关位操作
- SQL面试题