oracle 批量删除表数据的4种方式
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种方式的更多相关文章
- oracle 插入表数据的4种方式
1.往表中插入一整行数据 /*方法一*/ INSERT INTO 表名 VALUES(val1,val2,val3,...); /*方法二*/ '; 如: ,, FROM DUAL; 注意: 2. ...
- oracle删除表数据的两种的方式
转自:https://blog.csdn.net/qq_37840993/article/details/82490787 平时写sql中我们都会用到删除语句,而平时删除表数据的时候我们经常会用到两种 ...
- Oracle批量删除表格数据
在开发阶段往Oracle数据库中多个表格中导入了许多测试数据,倘若一张张表执行"truncate table tablename"语句显得十分繁琐.在PL/SQL中可以用代码进行批 ...
- oracle 清空表数据的2种方式及速度比较
1.情景展示 现在,需要清空该表数据 2.实现方式 为了比较删除速度,对该表进行复制 确认复制的表和原来的表数据是否一致 方式一:使用truncate table实现 方式二:使用de ...
- plsql 操纵表数据的2种方式
1.情景展示 在plsql中,对表的操作(增.删.改.查),其实有2种方式,只是很多人都只会第一种方式罢了. 2.方式介绍 第1种方式:直接将值与sql写到一起 直接按F8运行即可. 第2种方式: ...
- oracle中清空表数据的两种方法
1.delete from t 2 .truncate table t 区别: 1.delete是dml操作:truncate是ddl操作,ddl隐式提交不能回滚 2.delete from t可以回 ...
- oracle批量删除表
select 'DROP TABLE '||TABLE_NAME||';' from user_tables where table_name like ‘%T_%’
- MSSQLSERVER数据库- SQL删除重复数据的五种方式
删除重复的数据,在平时的工作中还是会和碰到的,感觉挺有用,从网上摘录的,记在这里,以备需要时查阅 --方法一,IN方式,适合2000/2005/2008,6728 毫秒 DELETE [student ...
- oracle 批量更新表字段
(一) 将数字替换成汉字 第一步,去重查询 使用distinct关键字先对该字段值进行去重查询,看共有几种情况 --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_T ...
随机推荐
- 用ImageSwitcher实现显示图片(更改图片时有动画效果)
ImageView和ImageSwitcher都是用来显示图片的.只不过后者在更新显示的图片的时候可以有动画效果. 注意点: 1.ImageSwitcher初始化需要定义一个ViewFactory,该 ...
- 《精通Oracle SQL(第2版) 》
<精通Oracle SQL(第2版) > 基本信息 作者: (美)Karen Morton Kerry Osborne Robyn Sands Riyaj Shamsud ...
- Petri网
Petri网是一种适合于系统描述和分析的数学模型,主要描述异步和并发关系.(或者Petri网是对离散并行系统的数学表示,适用于描述异步的,并发的计算机系统模型.) Petri网模型自然,直观,简单易懂 ...
- 整合 Ext JS 和第三方类库
介绍 ExtJS提供了许多高度可定制化内置组件.如果它不在框架(framework)里面,你可以很容易的扩展这些类,或者浏览Sencha市场(Sencha Market) 寻找你可能需要的任何东西.那 ...
- 奇怪吸引子---Coullet
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- 7.4 服务远程暴露 - 创建Exporter与启动netty服务端
为了安全:服务启动的ip全部使用10.10.10.10 远程服务的暴露总体步骤: 将ref封装为invoker 将invoker转换为exporter 启动netty 注册服务到zookeeper 订 ...
- solr4.7配置(ik-analyzer)
环境: windows server 2003 sp2 x86 tomcat8.0 solr-4.7.2 IK Analyzer 2012FF_hf1 ————————————华丽的分割线—————— ...
- MFC路径层的使用(BeginPath和EndPath函数)
响应WM_PAINT消息的代码如下: void CTextView::OnDraw(CDC* pDC) { CTextDoc* pDoc = GetDocument(); ASSERT_VALID(p ...
- laravel中的自定义函数的加载和第三方扩展库加载
l 1. 创建文件 app/Helpers/functions.php <?php // 示例函数 function foo() { return "foo"; } 2. 修 ...
- Github用.gitignore忽略指定文件
.gitignore Github提供.gitignore这种功能,可以自己指定哪些文件可以不被管理.具体方法是在版本管理的根目录下(与.git文件夹同级)创建一个.gitignore. 应用实例 项 ...