使用SQLLDR加载CSV(已拒绝)

时间:2013-08-21 07:48:23

标签: oracle csv load sql-loader ctl

我有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,
  )

我的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行有四列。

  1. 如何解决这个问题?
  2. 在加载期间我可以在“total”字段后插入当前日期吗?

1 个答案:

答案 0 :(得分:4)

你需要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.