网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
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!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.about kernel exploit.
.Oracle XQuery查询、构建和转换X.
.创建一个Oracle 数据库.
.如何防止某个关键文件被修改?.
.如何在Oracle中用PL/SQL产生随机.
.在单机上创建物理的Oracle9istan.
.Oracle基础工具简介.
.移动数据库和J2ME工具构建应用程.
.如何在linux环境下启动时打开num.
.在Oracle9i内向给定的表对象内插.
.Oracle 数据库函数库.
.使用索引的视可以增加程序的性能.
.Oracle SQL 内置函数大全(1).
.微软向SAP甲骨文正式宣战.
.ORACLE在HP_UX下的系列问题处理(.
.将一台Oracle7数据导入到另一台9.
.Oracle9i初始化参数中文说明(13).
.甲骨文表示保护数据库安全关键在.
.影响ORACLE性能的源头:性能调优.
.Oracle Database 10 g : 为 DBA .

用存储过程实现删除数据表的部分记录

发表日期:2008-3-14


在实际的工作和学习中,许多人经常需要分别删除数据表的某些记录,分批提交以此来减少对于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的变化 人气:1007
下一篇:解决启动数据库时发生的ORA-12528错误 人气:1734
浏览全部Oracle存储过程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐