2013-08-21 45 views
2

我有CSV文件。我要加载CSV文件的内容,以oracle database with SQLLDR.使用SQLLDR加载CSV(拒绝)

我SQLLDR是

@echo off 
sqlldr [email protected]/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”字段后插入当前日期吗?

回答

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. 
+0

它的工作。非常感谢你@Alex Poole – flyingbird013

+0

我可以编辑control.ctl为 **(id“TRIM(:id)”, load_date“SYSDATE”, name“TRIM(:name)”, total“TRIM :total)“, )** – flyingbird013

+0

@ flyingbird013 - 你需要在数据文件中有一个匹配的字段,为什么(如果不是空的话)的内容将被忽略。如果你还没有这样的领域,将它保留下来会更容易。如果您担心,控制文件中的字段顺序不必与表中的顺序相匹配。 (修剪数字字段可能也是毫无意义的,不是吗?) –