【问题标题】:Load CSV with SQLLDR (Rejected)使用 SQLLDR 加载 CSV(拒绝)
【发布时间】:2013-08-21 07:48:23
【问题描述】:

我有 CSV 文件。我想将 csv 文件的内容加载到oracle database with SQLLDR.

我的 SQLLDR 是

@echo off
sqlldr black@user/password data=D:\csv\data.csv control=D:\ctl\loader.ctl log=D:\ctl    \loader.log bad=D:\ctl\loader.bad
pause

我的 loader.ctl 是

  OPTIONS (SKIP=1)
    LOAD DATA
    APPEND  
  INTO TABLE data2007
  FIELDS TERMINATED BY ',' TRAILING NULLCOLS
  ( number "TRIM (:number)",
    name "TRIM (:name)",
    total "TRIM (:total)",
  )

表格

CREATE TABLE DATA2007 (
    number      VARCHAR2(6),
    name        VARCHAR2(30),
    total       NUMBER NULL,
  )

我的数据.csv:

Number,name,Total
1,"Marlyn",2000
2,"Bobby",1000
3,"Rina",2000
4,"Robby,Mr",5000
5,"juliet,Mrs",5000

第 1、2、3 行 = 成功,但第 4 行和第 5 行被拒绝。 我知道问题出在第 4 行和第 5 行有四列。

  1. 如何解决这个问题?
  2. 在加载过程中,我可以在“总计”字段之后插入当前日期吗?

【问题讨论】:

    标签: oracle csv load sql-loader ctl


    【解决方案1】:

    您需要delimit the field,因此双引号之间的逗号仅被视为值的一部分,而不是分隔符。

    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
    

    这确实应该是一个单独的问题,但是要加载一个固定值,您可以将列设置为具有默认值并且根本不在控制文件中指定它,或者如果可能的话,可以选择使用DEFAULTIF 子句有时想要覆盖它;或者更简单地使用 SQL 字符串来获取值。修改表定义以包含load_date 字段(并将第一列名称从number 更改为id,这不是保留字,并使其类型为NUMBER):

    CREATE TABLE DATA2007 (
      id          NUMBER,
      name        VARCHAR2(30),
      total       NUMBER NULL,
      load_date   DATE
    );
    

    那么控制文件就是:

    OPTIONS (SKIP=1)
      LOAD DATA
      APPEND
    INTO TABLE data2007
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
    ( id "TRIM (:id)",
      name "TRIM (:name)",
      total "TRIM (:total)",
      load_date "SYSDATE"
    )
    

    用你的原始数据文件运行它会得到:

    Total logical records skipped:          1
    Total logical records read:             5
    Total logical records rejected:         0
    Total logical records discarded:        0
    

    还有:

    SELECT * FROM data2007;
    
            ID NAME                                TOTAL LOAD_DATE
    ---------- ------------------------------ ---------- -------------------
             1 Marlyn                               2000 2013-08-21 09:37:38
             2 Bobby                                1000 2013-08-21 09:37:38
             3 Rina                                 2000 2013-08-21 09:37:38
             4 Robby,Mr                             5000 2013-08-21 09:37:38
             5 juliet,Mrs                           5000 2013-08-21 09:37:38
    
    5 rows selected.
    

    【讨论】:

    • 我可以将 control.ctl 编辑为 ( id "TRIM (:id)", load_date "SYSDATE", name "TRIM (:name)", total "TRIM (:total) ", )
    • @flyingbird013 - 您需要数据文件中的匹配字段,原因的内容(如果不为空)将被忽略。如果您还没有这样的字段,则保持原样会更容易。控制文件中的字段顺序不必与表中的顺序相匹配,如果这是您所关心的。 (修剪数字字段也可能毫无意义,不是吗?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多