将数据加载到单列中时,SQL * Loader会跳过第一个字符

时间:2019-05-10 14:59:41

标签: oracle sql-loader

我正在控制文件中加载以下数据,由于某种原因,它正在跳过第一个字符。

最初,问题是跳过第一个字符,加载第二个字符,而忽略其余字符!但是我使用TERMINATED BY '\n'修复了这个问题。

我已经添加了UTF8字符集(因为文件是Notepad ++所述的UTF-8),但是无论有没有结果都相同。

我找不到与此有关的任何其他信息-最接近的答案是CONTINUEIF引起了此问题,但我没有使用它。也许SQL * Loader正在读取每个记录的第一个字符是否有其他用途?

这是表格和序列:

create table test_table
( id number, raw_data varchar2(100) )
/

create sequence test_seq
/

这是控制文件和数据。序列位运行正常,并按预期填充TEST_TABLE.ID列。 TEST_DATA.RAW_DATA列会跳过每条记录的第一个字符(即A,C,E等)。

LOAD DATA
CHARACTERSET UTF8
INFILE * 
TRUNCATE INTO TABLE test_table
(
 id "TEST_SEQ.NEXTVAL",
 raw_data TERMINATED BY '\n'
)
BEGINDATA
A123 B456
C789 D012
E345 F678
J901 K234
L567 M890

我希望这会将每一行加载到TEST_TABLE.RAW_DATA列中。 相反,它跳过每个记录的第一个字符,并愉快地加载其余记录;即TEST_TABLE.RAW_DATA中的5条记录是:

123 B456
789 D012
345 F678
901 K234
567 M890

如何停止跳过第一个字符?

1 个答案:

答案 0 :(得分:0)

您的字段定义当前指出id是文件中的字段,并且由于您未指定数据类型,因此默认为单个字符。读取会消耗第一个字符,然后在SQL表达式覆盖该字符时将其丢弃。 raw_data字段然后从第二个字符开始。

您可以声明ID纯粹是一个表达式,而不是数据文件by using the EXPRESSION keyword中的字段:

...
(
 id EXPRESSION"TEST_SEQ.NEXTVAL",
 raw_data TERMINATED BY '\n'
)
...

在计算该ID值时,它将不会查看(或使用)文件中的任何数据,并且raw_data将从第一个字符开始。

您需要终止raw_data列,因为您也没有为其指定数据类型,因此也将默认为单个字符。如果愿意,可以声明其大小以匹配表定义:

...
(
 id expression "TEST_SEQ.NEXTVAL",
 raw_data CHAR(100)
)
...

您也可以设置一种虚拟的fields terminated by子句。这么多的选择...