1.情景展示

  情景一:

  删除PRIMARY_INDEX_TEST表中,MINDEX_ID字段为空的数据

  情景二:

  删除VIRTUAL_CARD_TEST表中的脏数据

2.解决方案

  情景一的解决方案:

DELETE FROM PRIMARY_INDEX_TEST WHERE MINDEX_ID IS NULL

  情景二的解决方案:

  最简单的方法,见文末 2019/10/17

  2018/12/10

  方案1:使用快速游标法(删除一次提交一次);

 --快速游标法
BEGIN
FOR TEMP_CURSOR IN (SELECT ID
FROM VIRTUAL_CARD3
WHERE INSTR(NAME, '*') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD3
WHERE INSTR(NAME, '#') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD3
WHERE INSTR(NAME, '/') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD3
WHERE INSTR(NAME, '+') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD3
WHERE INSTR(NAME, '!') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD3
WHERE INSTR(NAME, '.') > 0) LOOP
/* LOOP循环的是TEMP_CURSOR(逐条读取TEMP_CURSOR) */
DELETE FROM VIRTUAL_CARD3 WHERE VIRTUAL_CARD3.ID = TEMP_CURSOR.ID;
COMMIT; --提交
END LOOP;
END;

  执行时间:

  方案2:更多游标使用方法,见文末推荐;

  方案3:使用存储过程按id进行逐条删除。

 CREATE OR REPLACE PROCEDURE DELETE_TABLE_BATCH(V_ROWS IN NUMBER /*删除多少条数据后进行提交*/) IS
/**
* 内容:
* 日期:2018/12/05
* 作者:Marydon
* 版本:1.0
*/
I NUMBER(10); --声明变量,用于记录次数
BEGIN
FOR TEMP_TABLE IN (SELECT ID
FROM VIRTUAL_CARD_TEST
WHERE INSTR(NAME, '*') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD_TEST
WHERE INSTR(NAME, '#') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD_TEST
WHERE INSTR(NAME, '/') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD_TEST
WHERE INSTR(NAME, '+') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD_TEST
WHERE INSTR(NAME, '!') > 0
UNION
SELECT ID
FROM VIRTUAL_CARD_TEST
WHERE INSTR(NAME, '.') > 0) LOOP
/* LOOP循环的是TEMP_TABLE(逐条读取TEMP_TABLE) */
DELETE VIRTUAL_CARD_TEST WHERE VIRTUAL_CARD_TEST.ID = TEMP_TABLE.ID;
I := I + 1; --删除一次,+1
IF I >= V_ROWS THEN
COMMIT; --提交
I := 0; --重置
END IF;
END LOOP;
EXCEPTION
/* 输出异常信息 */
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('异常编号:' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('异常信息:' || SQLERRM);
ROLLBACK; --回滚
END DELETE_TABLE_BATCH;

  创建并运行该存储过程

  删除16522条数据,用了6分21秒,比方式一慢太多了。

  方案4:

  将要保留的数据插入到新表

 --将要保留的数据插入到新表
CREATE TABLE VIRTUAL_CARD_TEMP2 AS(
SELECT *
FROM VIRTUAL_CARD2
WHERE INSTR(NAME, '*') = 0
AND INSTR(NAME, '#') = 0
AND INSTR(NAME, '/') = 0
AND INSTR(NAME, '+') = 0
AND INSTR(NAME, '!') = 0
AND INSTR(NAME, '.') = 0)

  删除原来的表

--删除原表
drop table VIRTUAL_CARD2

  将新建的表进行重命名成删除表的名称。

  说明:原来的表有过存在外键约束等关系时,并没有进行测试,因为该表没有索引之类东西,自己测试的时候一定要慎重!!!

  方案5:使用in函数

DELETE FROM VIRTUAL_CARD_TEMP
WHERE ID_CARD IN (SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEMP T1
WHERE INSTR(T1.NAME, '*') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEMP T1
WHERE INSTR(T1.NAME, '#') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEMP T1
WHERE INSTR(T1.NAME, '/') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEMP T1
WHERE INSTR(T1.NAME, '+') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEMP T1
WHERE INSTR(T1.NAME, '!') > 0
UNION
SELECT T1.ID_CARD
FROM VIRTUAL_CARD_TEMP T1
WHERE INSTR(T1.NAME, '.') > 0)

  说明:ID_CARD字段必须具有唯一性。 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

相关推荐:

 

oracle 批量删除表数据的4种方式的更多相关文章

  1. oracle 插入表数据的4种方式

      1.往表中插入一整行数据 /*方法一*/ INSERT INTO 表名 VALUES(val1,val2,val3,...); /*方法二*/ '; 如: ,, FROM DUAL; 注意: 2. ...

  2. oracle删除表数据的两种的方式

    转自:https://blog.csdn.net/qq_37840993/article/details/82490787 平时写sql中我们都会用到删除语句,而平时删除表数据的时候我们经常会用到两种 ...

  3. Oracle批量删除表格数据

    在开发阶段往Oracle数据库中多个表格中导入了许多测试数据,倘若一张张表执行"truncate table tablename"语句显得十分繁琐.在PL/SQL中可以用代码进行批 ...

  4. oracle 清空表数据的2种方式及速度比较

            1.情景展示 现在,需要清空该表数据 2.实现方式 为了比较删除速度,对该表进行复制 确认复制的表和原来的表数据是否一致 方式一:使用truncate table实现 方式二:使用de ...

  5. plsql 操纵表数据的2种方式

      1.情景展示 在plsql中,对表的操作(增.删.改.查),其实有2种方式,只是很多人都只会第一种方式罢了. 2.方式介绍 第1种方式:直接将值与sql写到一起 直接按F8运行即可. 第2种方式: ...

  6. oracle中清空表数据的两种方法

    1.delete from t 2 .truncate table t 区别: 1.delete是dml操作:truncate是ddl操作,ddl隐式提交不能回滚 2.delete from t可以回 ...

  7. oracle批量删除表

    select 'DROP TABLE '||TABLE_NAME||';' from user_tables where table_name like ‘%T_%’

  8. MSSQLSERVER数据库- SQL删除重复数据的五种方式

    删除重复的数据,在平时的工作中还是会和碰到的,感觉挺有用,从网上摘录的,记在这里,以备需要时查阅 --方法一,IN方式,适合2000/2005/2008,6728 毫秒 DELETE [student ...

  9. oracle 批量更新表字段

      (一) 将数字替换成汉字 第一步,去重查询 使用distinct关键字先对该字段值进行去重查询,看共有几种情况 --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_T ...

随机推荐

  1. Java中IO的简单举例

    package com.kale.io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStr ...

  2. LINQ to XML 建立,读取,增,删,改

      LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在内存中错落有致.下面以一个小的例子说名LINQ ...

  3. [Android Pro] AndroidStudio IDE界面插件开发(Hello World篇)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53856916] 工欲善其事必先利其器,自打从Ecl ...

  4. Logstash中如何处理到ElasticSearch的数据映射

    Logstash作为一个数据处理管道,提供了丰富的插件,能够从不同数据源获取用户数据,进行处理后发送给各种各样的后台.这中间,最关键的就是要对数据的类型就行定义或映射. 本文讨论的 ELK 版本为 5 ...

  5. RFC 868 -- TIME Protocol

    INTERNET STANDARD Errata Exist Network Working Group J. Postel - ISI Request for Comments: 868 K. Ha ...

  6. Class:Task 类

    ylbtech-.Net-Class:Task 类 1. Task 类返回顶部 1-1. #region 程序集 mscorlib, Version=4.0.0.0, Culture=neutral, ...

  7. 使用C++/libCurl/Jsoncpp读取arcgis wmts 服务(restful模式)

    前言: 最近工作需要将arcgis的wmts服务接入我们的3DGis系统平台,要求用户只输入一个rest模式的wmts服务地址,系统即可自动获取并解析其元数据信息,生成wmts图层,并渲染显示.经过多 ...

  8. SQL SERVER 的用户数,连接,连接池 license

    SQL SERVER 理论上有32767个逻辑连接,SQL SERVER根据系统自行调配连接池. 首先 ,操作系统的用户数:即同时通过网络连接到这台电脑上面的用户限制,以5用户操作系统,搭建的文件服务 ...

  9. JS获取当前网页内容,创建文件并下载,URL.createObjectURL和URL.revokeObjectURL

    有时候需要在前端侧对于动态生成的内容进行下载,比如页面上某一段文本信息,再比如对页面进行分享的时候,希望分享图片是页面内容的实时截图,此时,这个图片就是动态的,纯HTML显然是无法满足我们的需求的,借 ...

  10. Packagist 镜像使用方法--composer

    镜像用法 有两种方式启用本镜像服务: 系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中.见“方法一” 单个项目配置: 将配置信息添加到某个项目的 com ...