网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.在SQL Server中快速删除重复记录.
.依赖于其他表格的标准轻松在表格.
.Sql Server 2005 数据库维护计划.
.数据库迁移的几种常用方式及优缺.
.SQL语句导入导出大全.
.sql server注册表操作相关的几个.
.net在sql server中的图片存取技术.
.数据库的查询优化技术.
.SQL Server2000数据库分离与附加.
.SQL Server与Excel数据互导.
.全文本检索的应用(2).
.两种与SQL Server数据库交换数据.
.SQL SERVER应用问题解答13例(三.
.sql server 2000 游标用法小例.
.教你快速掌握"patindex"函数的使.
.讲解如何检查使用空间大于90%的表.
.sql server发送邮件.
.使你的 SQL 语句完全优化.
.数据挖掘技术中的抽取存储 管理和.
.获取SQL Server元数据的几种方法.

教你快速掌握分别删除数据表记录的方法

发表日期:2008-5-10


很多情况下我们需要分别删除数据表的一些记录,分批来提交以此来减少对于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!');

注释:读者可以根据自己的实际情况来进行适当的调整。

上一篇:动态SQL的编译原理与基本开发思想的关系 人气:952
下一篇:教你快速掌握数据库设计的五种常见关系 人气:1128
浏览全部数据库的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐