SQL*Loader 在加载数据到单列时跳过第一个字符

SQL*Loader skips the first character when loading data into a single column

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

最初的问题是跳过第一个字符,加载第二个字符并忽略其余部分!但我通过使用 TERMINATED BY '\n'.

解决了这个问题

我已经添加了 UTF8 字符集(因为该文件是 Notepad++ 规定的 UTF-8 格式),但是使用或不使用它的结果都是一样的。

我找不到关于此的任何其他信息 - 最近的答案是 CONTINUEIF 导致了这个问题,但我没有使用它。也许 SQL*Loader 正在读取每条记录的第一个字符以获取其他信息?

这是 table 和序列:

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

如何阻止它跳过第一个字符?

您的字段定义目前表明 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 列,因为您也没有为其指定数据类型,因此它也将默认为单个字符。如果您愿意,您可以声明其大小与您的 table 定义相匹配:

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

您也可以改为设置 kind-of-dummy fields terminated by 子句。这么多选择...