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