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:使⽤快速游标法(删除⼀次提交⼀次);
1--快速游标法
2BEGIN
3FOR TEMP_CURSOR IN (SELECT ID
4FROM VIRTUAL_CARD3
5WHERE INSTR(NAME, '*') >0
6UNION
7SELECT ID
8FROM VIRTUAL_CARD3
9WHERE INSTR(NAME, '#') >0
10UNION
11SELECT ID
12FROM VIRTUAL_CARD3
13WHERE INSTR(NAME, '/') >0
14UNION
15SELECT ID
16FROM VIRTUAL_CARD3
17WHERE INSTR(NAME, '+') >0
18UNION
19SELECT ID
20FROM VIRTUAL_CARD3
21WHERE INSTR(NAME, '!') >0
22UNION
23SELECT ID
24FROM VIRTUAL_CARD3
25WHERE INSTR(NAME, '.') >0) LOOP
26/* LOOP循环的是TEMP_CURSOR(逐条读取TEMP_CURSOR) */
27DELETE FROM VIRTUAL_CARD3 WHERE VIRTUAL_CARD3.ID = TEMP_CURSOR.ID;
28COMMIT; --提交
29END LOOP;
30END;
执⾏时间:
⽅案2:更多游标使⽤⽅法,见⽂末推荐;
⽅案3:使⽤存储过程按id进⾏逐条删除。delete in
1CREATE 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); --声明变量,⽤于记录次数
9BEGIN
10FOR TEMP_TABLE IN (SELECT ID
11FROM VIRTUAL_CARD_TEST
12WHERE INSTR(NAME, '*') >0
13UNION
14SELECT ID
15FROM VIRTUAL_CARD_TEST
16WHERE INSTR(NAME, '#') >0
17UNION
18SELECT ID
19FROM VIRTUAL_CARD_TEST
20WHERE INSTR(NAME, '/') >0
21UNION
22SELECT ID
23FROM VIRTUAL_CARD_TEST
24WHERE INSTR(NAME, '+') >0
25UNION
26SELECT ID
27FROM VIRTUAL_CARD_TEST
28WHERE INSTR(NAME, '!') >0
29UNION
30SELECT ID
31FROM VIRTUAL_CARD_TEST
32WHERE INSTR(NAME, '.') >0) LOOP
33/* LOOP循环的是TEMP_TABLE(逐条读取TEMP_TABLE) */
34DELETE VIRTUAL_CARD_TEST WHERE VIRTUAL_CARD_TEST.ID = TEMP_TABLE.ID;
35 I := I +1; --删除⼀次,+1
36IF I >= V_ROWS THEN
37COMMIT; --提交
38 I :=0; --重置
39END IF;
40END LOOP;
41 EXCEPTION
42/* 输出异常信息 */
43WHEN OTHERS THEN
44 DBMS_OUTPUT.PUT_LINE('异常编号:'|| SQLCODE);
45 DBMS_OUTPUT.PUT_LINE('异常信息:'|| SQLERRM);
46ROLLBACK; --回滚
47END DELETE_TABLE_BATCH;
创建并运⾏该存储过程
删除16522条数据,⽤了6分21秒,⽐⽅式⼀慢太多了。
⽅案4:
将要保留的数据插⼊到新表
1--将要保留的数据插⼊到新表
2CREATE TABLE VIRTUAL_CARD_TEMP2 AS(
3SELECT*
4FROM VIRTUAL_CARD2
5WHERE INSTR(NAME, '*') =0
6AND INSTR(NAME, '#') =0
7AND INSTR(NAME, '/') =0
8AND INSTR(NAME, '+') =0
9AND INSTR(NAME, '!') =0
10AND INSTR(NAME, '.') =0)
删除原来的表
--删除原表
drop table VIRTUAL_CARD2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论