热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

oracle批量删除表数据的几种方法

这篇文章主要介绍了oracle批量删除表数据的几种方法,帮助大家更好的理解和使用Oracle数据库,感兴趣的朋友可以了解下

1.情景展示

  情景一:

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

  情景二:

  删除VIRTUAL_CARD_TEST表中的脏数据

2.解决方案

  情景一的解决方案: 

DELETE FROM PRIMARY_INDEX_TEST WHERE MINDEX_ID IS NULL

  情景二的解决方案:

  方案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 批量删除表数据的几种方法的详细内容,更多关于oracle 批量删除表数据的资料请关注其它相关文章!


推荐阅读
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 本文探讨了在SharePoint环境中使用BDC(Business Data Catalog)时遇到的问题及其解决策略,包括XML文件导入SSP后的不可见性问题以及与远程SQL Server 2005连接的难题。 ... [详细]
  • 本文提供了一个SQL脚本,用于在Microsoft SQL Server中创建一个数据字典视图,该视图详细列出了表名、表描述、字段名称、字段描述、字段类型、字段大小、字段精度、是否可为空、默认值以及是否为标识或主键等信息。 ... [详细]
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • 本文基于最新版SQLite 3.33.0(发布于2020年8月20日),详细介绍如何使用ORDER BY语句进行数据排序,包括单列和多列排序的方法。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文通过一系列实验,探讨了Oracle 11g数据库中密码错误验证延迟特性对用户登录速度的影响。实验旨在验证当某个用户因输入错误密码而触发延迟时,是否会影响其他用户的正常登录速度。 ... [详细]
  • SQL查询与事务管理:深入解析
    本文详细介绍了SQL查询的基本结构和高级特性,包括选择、分组查询以及权限控制等内容,并探讨了事务管理中的并发控制策略,旨在为数据库管理员和开发人员提供实用指导。 ... [详细]
  • PHP 图形函数中实现汉字显示的方法
    本文详细介绍了如何在 PHP 的图形函数中正确显示汉字,包括具体的步骤和注意事项,适合初学者和有一定基础的开发者阅读。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
author-avatar
ql3zqi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有