sql - ORA删除/截断

标签 sql oracle truncate sql-loader

我正在使用 SQL 加载器将我的数据加载到数据库中。

在插入数据之前,我需要删除表中的现有数据:

options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)
load data
infile 'G:1.csv' "str '^_^'"
replace
into table IMPORT_ABC
fields terminated by "," OPTIONALLY ENCLOSED BY '"'
trailing nullcols(
.
.
.
.)

但我得到了如下错误:

SQL*LOADER-926:对表 IMPORT_ABC 执行删除/截断时发生 OCI 错误
ORA-30036: 无法在撤消表空间“undo1”中将段扩展 8

如何删除数据,例如 10000 行?
我知道我的数据库有一些限制。

最佳答案

批量删除记录可以在 PL/SQL 循环中完成,但通常被认为是不好的做法,因为整个删除通常应视为单个事务;这不能从 SQL*Loader 控制文件中完成。您的 DBA 的大小应该是 UNDO空间来容纳您需要做的工作。

如果您要删除整个表,那么无论如何截断几乎肯定会更好,要么in the control file :

options(skip=1,load=250000,errors=0,ROWS=30000,BINDSIZE=10485760)
load data
infile 'G:1.csv' "str '^_^'"
truncate
into table IMPORT_ABC
...

或作为单独的 truncate 开始加载之前在 SQL*Plus/SQL Developer/其他客户端中的语句:
truncate table import_abc;

缺点是当加载新行时,您的表对其他用户来说是空的,但如果它是专用的导入区域(从名称中猜测),无论如何都可能无关紧要。

如果您的 UNDO真的那么小,那么您可能必须运行多个负载,在这种情况下-可能很明显-您需要确保只有 truncate在第一个的控制文件中(或使用单独的 truncate 语句),并有 append 而是在您在评论中指出的后续控制文件中。

您可能还想考虑 external tables如果您将此数据用作填充其他内容的基础,因为没有 UNDO替换外部数据源的开销。您可能需要与您的 DBA 讨论设置并授予您必要的目录权限。

关于sql - ORA删除/截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15878297/

相关文章:

sql - ms access 中 With 语句的替代方案

C# 关系型数据库

mysql - 选择人口接近平均值的国家

javascript - Chart JS 自定义标签不起作用

Java Double Trouble - 如何在不使用 BigDecimal 的情况下确保 4.45 是 4.45?

c# - 用省略号截断字符串,确保不破坏任何 HTML 实体

sql - 创建触发器函数是 psql "syntax error at or near "CREATE""

java - 如何在 Linux 上使用 Java 程序导出路径?

sql - 如何从 Oracle 中的表中获取列名?

sql - 按月分组的打开项目的 Oracle SQL 查询计数