问题描述
我正在尝试使用 sql*Loader 排除数据文件的最后一行,使用 WHEN 子句,但是当它到达该行时,它会同时填充坏文件和丢弃文件,并引发错误 2。
要忽略的行是最后一行,以“NOL”开头。
经过一番阅读,Error 2 是关于CTL 文件的synatx 的警告,但无法找出错误的地方。注意,如果我删除最后一行,然后运行相同的 CTL 文件,则不会引发 ERROR,因此问题不可能是 CTL 文件的语法。
为了解决这个问题,我在加载数据之前删除了最后一行,但想找出问题是什么,以便将来使用 WHEN 子句。
我试过了:
- file_dt != 'NOL'
- (1:1) !='N'
- . . .
但是我得到了同样的错误 2
。有没有其他人遇到过这个问题?或者有什么我可以尝试的?
Oracle 文档
SQL*Loader Command-Line ReferenceEX_SUCC 0 EX_FAIL 1 EX_WARN 2 EX_FTL 3
数据:
File-Date,Number 2021-05-04,24 2021-05-04,24 NOL: 4
CTL 文件:
OPTIONS (READSIZE=51200001,BINDSIZE=51200000,ROWS=5000,ERRORS=0,SKIP=1) load data append into table SOME_SCHEMA.soME_TABLE WHEN (01) 'NOL' fields terminated by ';' OPTIONALLY ENCLOSED BY '"' AND '"' trailing nullcols ( file_dt DATE "YYYY-MM-DD",a_number )
结果:
Path used: Conventional Commit point reached - logical record count 5Table SOME_SCHEMA.soME_TABLE: 4 Rows successfully loaded.
Check the log file: loading-file.log for more information about the load. 2021-05-06 09:42:12: Finished Loading Data into Table 2021-05-06 09:42:12: Status: 2
解决方法
我不在 Unix 上。尽管如此,加载应该是一样的。
表格:
SQL> desc test
Name Null? Type
----------------------------------------------------- -------- --------------------------
FILE_DT DATE
A_NUMBER NUMBER
SQL>
控制文件(为了简单起见,我在其中包含了示例数据):
OPTIONS (READSIZE=51200001,BINDSIZE=51200000,ROWS=5000,ERRORS=0,SKIP=1)
load data
infile *
replace
into table test
WHEN (01) <> 'NOL'
fields terminated by ','
trailing nullcols
(
file_dt DATE "YYYY-MM-DD",a_number
)
begindata
File-Date,Number
2021-05-04,24
2021-05-04,24
NOL: 4
加载会话和结果:
SQL> $sqlldr scott/tiger@orcl control=test38.ctl log=test38.log
SQL*Loader: Release 11.2.0.1.0 - Production on ╚et Svi 6 11:38:00 2021
Copyright (c) 1982,2009,Oracle and/or its affiliates. All rights reserved.
Commit point reached - logical record count 4
SQL> select * from test;
FILE_DT A_NUMBER
------------------- ----------
04.05.2021 00:00:00 24
04.05.2021 00:00:00 24
04.05.2021 00:00:00 24
04.05.2021 00:00:00 24
好像没问题。
那么,我做了什么不同的事情?
- 修改了
WHEN
子句 - 字段以逗号结束,而不是分号
- 删除了多余的信息