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
子句。这么多选择...
我正在将以下数据加载到控制文件中,但由于某种原因它跳过了第一个字符。
最初的问题是跳过第一个字符,加载第二个字符并忽略其余部分!但我通过使用 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
子句。这么多选择...