栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 系统运维 > 数据库 > 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
 
 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
 
 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
 
 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 批量删除表数据的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/171009.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号