【问题标题】:SQL*Loader control file few columns are blankSQL*Loader 控制文件几列是空白的
【发布时间】:2015-04-30 22:38:43
【问题描述】:

我的文件名 .dat 文件包含以下格式的 1000 条记录。

SIC_ID|NAME|CHANGED_DATE|LOGICALLY_DELETED
110|Wheat|31/10/2010 29:46:00|N

我要在其中提供内容的表格还有几列。我希望将这些列留空,因为 .dat 文件中没有内容。 表格列:

SIC_ID, NAME, CREATED_USER_ID ,CREATED_DATE ,CHANGED_USER_ID ,CHANGED_DATE,LOGICALLY_DELETED,RECORD_VERSION

我的控制文件如下:-

    OPTIONS (DIRECT=TRUE,SKIP=1)
    LOAD DATA CHARACTERSET WE8MSWIN1252
    INFILE "mic_file.dat"
    BADFILE "sql/mic_file.bad"
    REPLACE
    INTO TABLE SDS_SIC
    FIELDS TERMINATED BY "|"
    TRAILING NULLCOLS
    (SIC_ID, NAME,
DATE "DD/MM/YYYY HH24:MI:SS" NULLIF (CHANGED_DATE=BLANKS),
LOGICALLY_DELETED)

运行 SQL*Loader 后,我看到以下错误:

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
SIC_ID                              FIRST     *   |       CHARACTER
NAME                                 NEXT     *   |       CHARACTER
CHANGED_DATE                         NEXT     *   |       CHARACTER
LOGICALLY_DELETED                    NEXT     *   |       CHARACTER

Record 1: Rejected - Error on table SDS_SIC, column CHANGED_DATE.
ORA-26041: DATETIME/INTERVAL datatype conversion error

最后两行错误被多次抛出。现在已经解决了:)

错误 2:LOGICALLY_DELETED 只有 2 个可能的值 - Y 或 N。

Record 51: Rejected - Error on table SDS_SIC, column LOGICALLY_DELETED.
ORA-12899: value too large for column LOGICALLY_DELETED (actual: 2, maximum: 1)

多次显示上述错误。

【问题讨论】:

    标签: sql-loader controlfile


    【解决方案1】:

    请记住,控制文件的列列表是按字段在数据文件中的顺序排列的。数据按名称与表列匹配。您的控制文件的第 3 和第 4 字段映射到 FILLER,这就是它们为空的原因。 FILLER 仅适用于您不需要的数据文件中的字段。

    您只在列列表部分需要这样的东西,TRAILING NULLCOLS 将处理表的其余列:

    (SIC_ID, 
     NAME, 
     CHANGED_DATE  DATE "DD/MM/YYYY HH24:MI:SS" NULLIF (CHANGED_DATE=BLANKS),
     LOGICALLY_DELETED
    )
    

    查看最近的这篇文章,它通过举例来描述这种关系:Skipping data fields while loading delimited data using SQLLDR

    【讨论】:

    • 谢谢!它很有用。删除了填充符。但我希望将表格中的额外列留空。
    • 这就是为什么你有 TRAILING NULLCOLS :-) 表中未在控制文件中命名的列将是空白的(当然假设它们允许空值)。来自文档:TRAILING NULLCOLS 子句告诉 SQL*Loader 将记录中不存在的任何相对定位的列视为空列。
    • 正确。我检查了。但我得到一个错误。请查看更新的问题
    • 你需要告诉 SQL*Loader 日期是什么格式:CHANGED_DATE DATE "DD/MM/YYYY HH24:MI:SS" NULLIF (CHANGED_DATE =BLANKS)
    • SQL*Loader 看到 LOGICALLY_DELETED 的 2 个字节数据。可能是数据文件中的不可见字符,或者可能是由于字符集冲突。如果您在 *NIX 上加载数据,这也很常见,但数据文件来自 Windows 系统,其中行尾为 2 个字符,但在 *NIX 上,行尾字符为单个:blog.codinghorror.com/the-great-newline-schism
    【解决方案2】:

    您可以转到 MySQL 命令行客户端并将值插入所需的列,您应该执行以下操作: 就像你想将值插入到

    SIC_ID|NAME|CHANGED_DATE|LOGICALLY_DELETED

    而不是那些额外的列。你应该输入:

    insert into 'whatever the table name is'(SIC_ID,NAME,CHANGED_DATE,LOGICALLY_DELETED)
    values(112,'wheat','31/10/2010 19:46:00',N);
    

    仅在您使用列的属性 varchar 的地方使用单引号 试试看....它会工作的

    【讨论】:

    • 阿尤布,谢谢。但我想使用 SQL*Loader 来做到这一点 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多