oracle中如何批量删除表数据
创始人
2024-11-17 08:22:31
0次

1.情景展示

  情景一:

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

oracle中如何批量删除表数据

  情景二:

  删除VIRTUAL_CARD_TEST表中的脏数据

oracle中如何批量删除表数据

2.解决方案

  情景一的解决方案: 

DELETE FROM PRIMARY_INDEX_TEST WHERE MINDEX_ID IS NULL

oracle中如何批量删除表数据

  情景二的解决方案:

  方案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;

  执行时间:

oracle中如何批量删除表数据

  方案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;

  创建并运行该存储过程

oracle中如何批量删除表数据

  删除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中如何批量删除表数据

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...