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 ...
随机推荐
- PHP工程师笔试题
PHP工程师笔试题 提示:请将答案写在另外一张空白纸上,并在30分钟内完成. PHP 请写出include.require.include_once.require_noce的区别. include是 ...
- react常用模块介绍
react各个模块: 1.node.js自带的模块(原生模块):https://www.jianshu.com/p/abc72267abfc原生模块的api文档地址:http://nodejs.cn/ ...
- Table does not have the identity property. Cannot perform SET operation.
Table does not have the identity property. Cannot perform SET operation. 解决: set IDENTITY_INSERT ...
- Asp.net WebAPi gzip压缩和json格式化
现在webapi越来越流行了,很多时候它都用来做接口返回json格式的数据,webapi原本是根据客户端的类型动态序列化为json和xml的,但实际很多时候我们都是序列化为json的,所以webapi ...
- [leetcode]Scramble String @ Python
原题地址:https://oj.leetcode.com/problems/scramble-string/ 题意: Given a string s1, we may represent it as ...
- AVL树原理及实现 +B树
1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好是按照从小到大的顺序或者从大到小的顺序插入的,那么搜索二叉树就对退化成链表,这个时候查找,插入和删除的时间都会 ...
- js改变iframe 的src地址
<script> function dizhi(){ document.getElementById("aaa").src='http://www.sohu.com' ...
- 什么是JSP (转)
http://blog.csdn.net/javaloveiphone/article/details/7937170 一.什么是JSP(JavaServer Pages),原来是没有jsp的,只有s ...
- 在使用Vs2013打开Vs2008的解决方案时出现了以下错误:此版本的应用程序不支持其项目类型(.csproj)
在使用Vs2013打开Vs2008的解决方案时出现了以下错误: 无法打开 因为此版本的应用程序不支持其项目类型(.csproj). 在网络上找到解决方案: 命令行或者Vs自带的命令提示符输入:deve ...
- OpenNebula学习第二节OpenNebula Node Installation
一.准备工作 准备一台物理机或者虚拟机:Ubuntu16.0.4 已经更新了aliyun的source cpu支持虚拟化 关闭防火墙 二.安装步骤 2.1:下载opennebula repo源 wge ...