sqlldr 仅将字符串的第一个字符加载到列中

sqlldr only loading first character of string into column

我正在尝试使用 sqlldr 将数据加载到数据库 table。 我遇到的问题是只有每行的第一个字符被加载。 我在 AIX 上使用 Oracle 12.1 版。 我的数据是单列文本文件。 每条记录的长度都是可变的。 在此测试集中,我们将数据限制为 10 个字符。 每行都在一个新行上。 它应该加载到单个列中 table.

我的空 table 定义为:

create table test_table (test_num varchar2(10));

我的数据看起来像但没有双倍行距:

3675536758

8370530737

9318078

5395653669

查看 od -c 中的数据,它看起来像:

0000000    3   6   7   5   5   3   6   7   5   8  \n   8   3   7   0   5
0000020    3   0   7   3   7  \n   9   3   1   8   0   7   8  \n   5   3
0000040    9   5   6   5   3   6   6   9  \n
0000051

我的控制文件如下所示:

load data
 infile 'test.txt' "str '\n'"
 into TABLE test_table
 (test_num char "trim(:test_num)")

我遇到的问题只是每行的第一个字符被加载到 table。

无论是否使用 trim 函数,无论是否使用 "str '\n'"

,此行为都会持续存在

如有任何建议,我们将不胜感激。

(test_num char "trim(:test_num)")修改为(test_num char(10) "trim(:test_num)"),记录将按预期加载。

char 将是一个字符,而 char(10) 将是 10 个字符。

在windows服务器上,我将控制文件更改为不使用流记录格式(不是问题的根源)。

load data
 infile * 
 into TABLE test_table
 (test_num char(10) "trim(:test_num)")
BEGINDATA
3675536758
8370530737
9318078
5395653669

我们现在看到这些记录:

SCOTT@erptst>select * from test_table;
TEST_NUM
3675536758
8370530737
9318078
5395653669

或者,terminated by whitespace 可能有帮助:

load data
infile * 
replace
into table test_table
(test_num  terminated by whitespace
)
begindata
3675536758
8370530737
9318078
5395653669

正在加载会话和结果:

SQL> $sqlldr scott/tiger@orclcontrol=test23.ctl

SQL*Loader: Release 11.2.0.2.0 - Production on Pet Vel 23 07:45:32 2018

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

Commit point reached - logical record count 3
Commit point reached - logical record count 4

SQL> select * from test_table;

TEST_NUM
----------
3675536758
8370530737
9318078
5395653669

SQL>