Oracle 使用SQLLDR加载CSV(已拒绝)

Oracle 使用SQLLDR加载CSV(已拒绝),oracle,csv,load,sql-loader,ctl,Oracle,Csv,Load,Sql Loader,Ctl,我有CSV文件。我想用SQLLDR将csv文件的内容加载到oracle数据库。 我的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 My loader.ctl是 OPTIONS (SKIP=1) LOAD DATA APPEND

我有CSV文件。我想用SQLLDR将csv文件的内容加载到oracle数据库。

我的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
My 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,
  )
My data.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行有四列

  • 如何解决这个问题
  • 加载期间,我是否可以在“总计”字段后插入当前日期
  • 您需要这样做,以便双引号之间的逗号仅被视为值的一部分,而不是分隔符

    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
    
    这实际上应该是一个单独的问题,但要加载固定值,您可以将列设置为具有默认值,并且根本不在控制文件中指定它,或者如果您有时想要覆盖它,可以选择使用
    DEFAULTIF
    子句;或者更简单地使用SQL字符串来获取值。修改表定义以包含
    load\u date
    字段(并将第一列名称从
    number
    更改为
    id
    ,它不是保留字,并将其键入
    number
    ):

    那么控制文件是:

    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
    
    以及:

    您需要这样做,以便双引号之间的逗号仅被视为值的一部分,而不是分隔符

    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
    
    这实际上应该是一个单独的问题,但要加载固定值,您可以将列设置为具有默认值,并且根本不在控制文件中指定它,或者如果您有时想要覆盖它,可以选择使用
    DEFAULTIF
    子句;或者更简单地使用SQL字符串来获取值。修改表定义以包含
    load\u date
    字段(并将第一列名称从
    number
    更改为
    id
    ,它不是保留字,并将其键入
    number
    ):

    那么控制文件是:

    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
    
    以及:


    我是否可以将control.ctl编辑为(id“TRIM(:id)”、load_date“SYSDATE”、name“TRIM(:name)”、total“TRIM(:total)”、)@flyingbird013-您需要在数据文件中找到一个匹配字段,why(如果不是空的话)的内容将被忽略。如果您还没有这样一个字段,就更容易保持原样。控制文件中的字段顺序不必与表中的顺序相匹配,如果您担心的话。(修剪数字字段可能也没什么意义,不是吗?)我可以将control.ctl编辑为(id“TRIM(:id)”,加载日期为“SYSDATE”,名称为“TRIM(:name)”,总计为“TRIM(:total)”,@flyingbird013-您需要在数据文件中有一个匹配的字段,why的内容(如果不是空的话)将被忽略。如果您还没有这样一个字段,就更容易保持原样。控制文件中的字段顺序不必与表中的顺序相匹配,如果您担心的话。(修剪数字字段可能也毫无意义,不是吗?)