Oracle SQL*Loader WHEN 子句引发错误 2 Oracle 文档数据:CTL 文件:结果:

问题描述

我正在尝试使用 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 Reference

对于 UNIX,退出代码如下:

EX_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 5

Table 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 子句
  • 字段以逗号结束,而不是分号
  • 删除了多余的信息