oracle 批量删除表数据的4种方式 202523609编辑

Heaven helps those who help themselves
资深码农+深耕理财=财富自由
欢迎关注

oracle 批量删除表数据的4种方式

Created by Marydon on 2018-12-05 18:19

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:使用快速游标法(删除一次提交一次);

复制代码
 1 --快速游标法
 2 BEGIN
 3   FOR TEMP_CURSOR IN (SELECT ID
 4                         FROM VIRTUAL_CARD3
 5                        WHERE INSTR(NAME, '*') > 0
 6                       UNION
 7                       SELECT ID
 8                         FROM VIRTUAL_CARD3
 9                        WHERE INSTR(NAME, '#') > 0
10                       UNION
11                       SELECT ID
12                         FROM VIRTUAL_CARD3
13                        WHERE INSTR(NAME, '/') > 0
14                       UNION
15                       SELECT ID
16                         FROM VIRTUAL_CARD3
17                        WHERE INSTR(NAME, '+') > 0
18                       UNION
19                       SELECT ID
20                         FROM VIRTUAL_CARD3
21                        WHERE INSTR(NAME, '!') > 0
22                       UNION
23                       SELECT ID
24                         FROM VIRTUAL_CARD3
25                        WHERE INSTR(NAME, '.') > 0) LOOP
26     /* LOOP循环的是TEMP_CURSOR(逐条读取TEMP_CURSOR) */
27     DELETE FROM VIRTUAL_CARD3 WHERE VIRTUAL_CARD3.ID = TEMP_CURSOR.ID;
28     COMMIT; --提交
29   END LOOP;
30 END;
复制代码

  执行时间:

  方案2:更多游标使用方法,见文末推荐;

  方案3:使用存储过程按id进行逐条删除。

复制代码
 1 CREATE OR REPLACE PROCEDURE DELETE_TABLE_BATCH(V_ROWS IN NUMBER /*删除多少条数据后进行提交*/) IS
 2   /**
 3   * 内容:
 4   * 日期:2018/12/05
 5   * 作者:Marydon
 6   * 版本:1.0
 7   */
 8   I NUMBER(10); --声明变量,用于记录次数
 9 BEGIN
10   FOR TEMP_TABLE IN (SELECT ID
11                        FROM VIRTUAL_CARD_TEST
12                       WHERE INSTR(NAME, '*') > 0
13                      UNION
14                      SELECT ID
15                        FROM VIRTUAL_CARD_TEST
16                       WHERE INSTR(NAME, '#') > 0
17                      UNION
18                      SELECT ID
19                        FROM VIRTUAL_CARD_TEST
20                       WHERE INSTR(NAME, '/') > 0
21                      UNION
22                      SELECT ID
23                        FROM VIRTUAL_CARD_TEST
24                       WHERE INSTR(NAME, '+') > 0
25                      UNION
26                      SELECT ID
27                        FROM VIRTUAL_CARD_TEST
28                       WHERE INSTR(NAME, '!') > 0
29                      UNION
30                      SELECT ID
31                        FROM VIRTUAL_CARD_TEST
32                       WHERE INSTR(NAME, '.') > 0) LOOP
33     /* LOOP循环的是TEMP_TABLE(逐条读取TEMP_TABLE) */
34     DELETE VIRTUAL_CARD_TEST WHERE VIRTUAL_CARD_TEST.ID = TEMP_TABLE.ID;
35     I := I + 1; --删除一次,+1
36     IF I >= V_ROWS THEN
37       COMMIT; --提交
38       I := 0; --重置
39     END IF;
40   END LOOP;
41 EXCEPTION
42   /* 输出异常信息 */
43   WHEN OTHERS THEN
44     DBMS_OUTPUT.PUT_LINE('异常编号:' || SQLCODE);
45     DBMS_OUTPUT.PUT_LINE('异常信息:' || SQLERRM);
46     ROLLBACK; --回滚
47 END DELETE_TABLE_BATCH;
复制代码

  创建并运行该存储过程

  删除16522条数据,用了6分21秒,比方式一慢太多了。 

  方案4:

  将要保留的数据插入到新表

复制代码
 1 --将要保留的数据插入到新表
 2 CREATE TABLE VIRTUAL_CARD_TEMP2 AS(
 3 SELECT *
 4   FROM VIRTUAL_CARD2
 5  WHERE INSTR(NAME, '*') = 0
 6    AND INSTR(NAME, '#') = 0
 7    AND INSTR(NAME, '/') = 0
 8    AND INSTR(NAME, '+') = 0
 9    AND INSTR(NAME, '!') = 0
10    AND INSTR(NAME, '.') = 0)
复制代码

  删除原来的表

--删除原表
drop table VIRTUAL_CARD2

  将新建的表进行重命名成删除表的名称。

  说明:原来的表有过存在外键约束等关系时,并没有进行测试,因为该表没有索引之类东西,自己测试的时候一定要慎重!!!

  方案5:使用in函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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字段必须具有唯一性。 

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

 

与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。

您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!

↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓

posted @   Marydon  阅读(23609)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
sorry,本博客所有代码禁止复制,原创代码需扫码支付方可获取!
关闭

1、先加好友再付费,点我加好友;

2、代码不能满足你的需求?加好友付费定制你的专属代码!

3、付费标准及方式,点我查看详情。