oracle 批量删除表数据的几种方法
编程学习 2021-07-05 16:09www.dzhlxh.cn编程入门
这篇文章主要介绍了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 批量删除表数据的资料请关注狼蚁SEO其它相关文章!
编程语言
- Win10 PC创意者更新慢速版15048改进内容与已知问题
- 用纯CSS3实现网页中常见的小箭头
- 神舟笔记本问题集锦
- Bellnames常用操作说明
- 揭秘手机淘宝搜索排序的影响因素
- XHTML入门学习教程-网页Head和DTD
- 笔记本光驱保养常用知识
- hzhost虚拟主机系统致命漏洞
- 电脑无线网络出现红色叉叉无线网卡打不开的六
- 16项评比不得不看 机箱哪些功能最实用
- AI怎么绘制一个呲牙的qq表情-
- 红帽指点杆机械键盘 TEX Yoda上手体验测评
- 笔记本电脑保养常识有哪些-笔记本保养常识总结
- cdr怎么设计圆角矩形效果的图标-
- 在XSLT样式表中声明命名空间小结
- Fireworks教程-常用操作技巧总结