条件导入 - 如何丢弃记录?
Conditional import - how to discard records?
我想使用 SQLLDR 导入一个 csv 文件,但我只想要特定的记录。我已经在我的控制文件中用 "WHEN record_type = 1"
解决了这个问题。
这有效,但是日志文件被 "Record xxx: Discarded - failed all WHEN clauses." 淹没了 输入文件包含数百万条记录,但只有百分之几满足条件,所以我最终使用与输入文件大小相同的日志文件:)
我做错了吗?
使用 SQLLDR 时是否有另一种方法 discard/filter 记录?
示例数据:
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
(...
)
如果您只是想摆脱日志,您可以将这些日志发送到 /dev/null
如果您在 Windows 上使用 Linux/Unix 和 NUL
。
例子
数据文件。
[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
在我看来,你所做的是正确的。
SQL*Loader 正在为您记录最精细级别的加载详细信息。您可以选择退出一些内容。
你可以通过添加禁用 DISCARD
记录日志记录
SILENT=(DISCARDS)
到你的 SQL*Loader
您可以参考DOC了解更多详情。
使用外部 table,然后您可以使用简单的 SQL 加载您的 table...
insert into my_table_t( record_type, a, b, c )
select record_type, a, b, c
from my_external_table
where record_type != 1
我想使用 SQLLDR 导入一个 csv 文件,但我只想要特定的记录。我已经在我的控制文件中用 "WHEN record_type = 1"
解决了这个问题。
这有效,但是日志文件被 "Record xxx: Discarded - failed all WHEN clauses." 淹没了 输入文件包含数百万条记录,但只有百分之几满足条件,所以我最终使用与输入文件大小相同的日志文件:)
我做错了吗? 使用 SQLLDR 时是否有另一种方法 discard/filter 记录?
示例数据:
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
(...
)
如果您只是想摆脱日志,您可以将这些日志发送到 /dev/null
如果您在 Windows 上使用 Linux/Unix 和 NUL
。
例子
数据文件。
[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
在我看来,你所做的是正确的。
SQL*Loader 正在为您记录最精细级别的加载详细信息。您可以选择退出一些内容。
你可以通过添加禁用 DISCARD
记录日志记录
SILENT=(DISCARDS)
到你的 SQL*Loader
您可以参考DOC了解更多详情。
使用外部 table,然后您可以使用简单的 SQL 加载您的 table...
insert into my_table_t( record_type, a, b, c )
select record_type, a, b, c
from my_external_table
where record_type != 1