简单范例

create or replace procedure delete_table
is
i number(10);
begin
for x in (select * from emp where DEPTNO like 'a%')
loop
delete emp where emp.id = x.id
i:=i+1;
if i>1000 then
commit;
i:=0;
end if;
end loop;
exception
when others then
dbms_out.put_line(sqlcode);
rollback;
end delete_table;

  Oracle中删除超过50w条记录的数据,如果直接使用delete,效率就严重受到了影响。那么首先我们需要了解对于这个表的数据,我们到底是全部删除,还是部分删除。这里有三个关键字我们需要注意:truncate,delete,drop,他们之间的异同点可以参考这篇文章——truncate,delete,drop的异同点

  全部删除,不保留数据结构就直接drop最好。如果是部分删除,一般就这样一些办法:

  1. 如果删除的数据是大部分,分段提交删除的数据。

create or replace procedure 
delete_table is i number(10); 
begin   
for x in (select * from emp where DEPTNO like ‘a%’)   
loop       
delete emp where emp.id = x.id i:=i+1;       
if i>1000 then          
commit;          
i:=0;       
end if;   
end loop; 
exception when others then dbms_out.put_line(sqlcode);
rollback
end delete_table;

  或者

–每500条数据提交一次
DECLARE CNT NUMBER(10):=0; 
I NUMBER(10); 
BEGIN 
SELECT COUNT(*) INTO CNT FROM ep_arrearage_bak 
WHERE TO_CHAR(DF_DATE,‘MM’)=’01′; 
FOR I IN 1..TRUNC(CNT/500)+1 
LOOP 
DELETE FROM ep_arrearage_bak WHERE TO_CHAR(DF_DATE,‘MM’)=’01′ ANDROWNUM<=500; 
COMMIT
END LOOP; 
END;

  2、把要保留的数据放在一个临时表里,truncate table原表后再放回来;

create table t_back as select * from t where ….
drop table t;
rename t_back to t;

  3. 专门使用一个大回滚段 ,比如定义:undo tablespace 2G

  4、如果将方法1做一点修改,可以这么做:

有条件的分步删除数据表中的记录

–创建测试表 
create table test as select * from dba_objects;

–创建删除表的存储过程  
create or replace procedure deleteTab

–插入语句    
SQLinsert into test select * from dba_objects; 
6374 rows created. 
SQL> / 6374 rows created. 
SQL> / 6374 rows created. 
SQLcommit
– 创建删除的存储过程 
create or replace procedure deleteTab
/**    
** Usage: run the script to create the proc deleteTab    
**        in SQL*PLUS, type "exec deleteTab(‘Foo’,'ID>=1000000′,’3000′);"    
**        to delete the records in the table "Foo", commit per 3000 records.    
**       Condition with default value ’1=1′ and default Commit batch is 10000.    
**/   
(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!’);   
end;   /

–执行语句 
SQLexec deleteTab(‘TEST’,‘object_id >0′,’10000′)

java_Oralce的更多相关文章

随机推荐

  1. LeetCode题解——String to Integer(atoi)

    题目: 字符串转换为数字. 解法: 这道题的意思是要考虑到,如果有前置的空字符,则跳过:如果超出数字范围,则返回最大/最小整数:如果碰到第一个不能转换的字符,则返回. 代码: class Soluti ...

  2. 关于c3p0配置详细说明

    <!-- c3p0连接池配置 --> <property name="driverClass" value="${c3p0.driverClass}&q ...

  3. Hadoop学习笔记2---配置详解

    配置系统是复杂软件必不可少的一部分,而Hadoop配置信息处理是学习Hadoop源代码的一个很好的起点.现在就从Hadoop的配置文件谈起. 一.Hadoop配置格式 Hadoop配置文件格式如下所示 ...

  4. public, protected, private, internal, protected internal简析

    public是可访问权限最高的,比如姓名,每个人都可以知道别人的姓名,这个不是什么秘密 protected的访问权限要低些,只有子类才可以访问得到父类的protected属性.就好像老子的财产只有儿子 ...

  5. Quality Center配置邮箱服务

    Quality Center上要配置二个地方 mail direct pro配置 DNS地址是本机的地址就好了,不需要真实的DNS地址 SMTP端口使用普通的25就好了,不需要使用SSL的·465端口 ...

  6. Excel DNA学习笔记一

    由于各种原因,被迫学习Excel DNA这个开源项目的使用方法,最后希望可以在其中,调用xll进行编码. 由此整理一下,这期间使用到的一些资料. 1.下载Excel DNA,目前最新的是0.30版 h ...

  7. OpenStack official programs

    What are programs ? The OpenStack project mission is to produce the ubiquitous Open Source Cloud Com ...

  8. sgu - 274 - Spam-filter

    题意:判断一个字符串是不是有效的邮件地址. 题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=274 ——>>照着题目做. ...

  9. Apache POI 合并单元格

    合并单元格所使用的方法: sheet.addMergedRegion( CellRangeAddress  cellRangeAddress  );   CellRangeAddress  对象的构造 ...

  10. 使用synchronize同步关键字来同步代码快

    1.synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有 ...