【问题标题】:Conditional import - how to discard records?条件导入 - 如何丢弃记录?
【发布时间】:2017-02-10 18:39:26
【问题描述】:

我想使用 SQLLDR 导入一个 csv 文件,但我只想要特定的记录。我已经在我的控制文件中使用"WHEN record_type = 1" 解决了这个问题。

这可行,但日志文件被 “记录 xxx:丢弃 - 所有 WHEN 子句都失败。” 输入文件包含数百万条记录,但只有百分之几满足条件,所以我最终得到一个与输入文件大小相同的日志文件:)

我做错了吗? 使用 SQLLDR 时是否有其他方法可以丢弃/过滤记录?

示例数据:

record_type;a;b;c
24;a1;b1;c1
17;a2;b2;c2
22;an;bn;cn
1;a1;b1;c1
1;a2;b2;c2
1;an;bn;cn

控制文件

load data
truncate
into table my_table_t
WHEN record_type = 1
(...
)

【问题讨论】:

  • 您可以尝试使用外部表而不是 SQL*Loader。或者,如果目标行只是文件的一小部分,您可以使用 UNIX 模式匹配命令构建一个仅包含目标记录的小文件。
  • @ChristianPalmer,目标行只是文件的一小部分,所以我也研究了 unix 过滤。谢谢你的想法。
  • 类似 UNIX> grep -e "^1;" test_file.dat > output_file.dat

标签: oracle sql-loader


【解决方案1】:

你所做的就是正确的 IMO。

SQL*Loader 正在为您记录最详细的加载细节。您可以选择退出一些事情。

您可以通过添加禁用DISCARD 记录日志记录 SILENT=(DISCARDS) 给你的SQL*Loader

您可以参考DOC了解更多详情。

【讨论】:

  • 谢谢,我自己发现了这个。但我正在删除我自己的答案。这正是我想要的
【解决方案2】:

如果您只是想删除日志,如果您使用 Linux/Unix 和 Windows 上的NUL,可以将这些日志发送到 /dev/null

示例

数据文件。

[oracle@ora12c Desktop]$ cat sample.txt 
record_type;a;b;c
24;a1;b1;c1
17;a2;b2;c2
22;an;bn;cn
1;a1;b1;c1
1;a2;b2;c2
1;an;bn;cn

控制文件。

[oracle@ora12c Desktop]$ cat control.ctl 
load data
 infile 'sample.txt'
 insert
 into table table_1  when record_type = '1'
 fields terminated by ";"
 (record_type, a, b, c)

让我们尝试加载记录。

[oracle@ora12c Desktop]$ sqlldr jay/password@orapdb1 control=control.ctl data=sample.txt log=/dev/null

SQL*Loader: Release 12.1.0.2.0 - Production on Fri Feb 10 16:05:10 2017

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Path used:      Conventional
Commit point reached - logical record count 7

Table TABLE_1:
  3 Rows successfully loaded.

Check the log file:
  /dev/null
for more information about the load.

没有日志文件。

现在我们得到了唯一选定的记录。

SQL> select * from table_1;

RECORD_TYPE A            B            C
----------- -------------------- -------------------- --------------------
      1 a1           b1           c1
      1 a2           b2           c2
      1 an           bn           cn

【讨论】:

  • 谢谢,但我需要日志文件,所以不能完全丢弃。
【解决方案3】:

使用外部表,然后您可以使用简单的 SQL 来加载您的表...

insert into my_table_t( record_type, a, b, c )
select record_type, a, b, c 
from my_external_table
where record_type != 1

【讨论】:

  • 在这种特殊情况下我不能使用外部表。
  • @Ronnis。您能否详细说明为什么不能使用外部表?
猜你喜欢
  • 1970-01-01
  • 2019-01-15
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多