【问题标题】:SQL*Loader skips the first character when loading data into a single columnSQL*Loader 在将数据加载到单列时跳过第一个字符
【发布时间】:2019-05-10 14:59:41
【问题描述】:

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

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

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

我找不到与此相关的任何其他信息 - 最接近的答案是 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

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

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    您的字段定义当前说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 子句。这么多选择...

    【讨论】:

    • 非常感谢您的解释。完全有道理!我已经修改了我的代码并进行了一些测试 - 一切正常。还注意到按照您的建议明确声明大小,这很有效。 :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多