2

我有 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. 在加载过程中,我可以在“总计”字段之后插入当前日期吗?
4

1 回答 1

4

您需要对字段进行定界,以便双引号之间的逗号被视为值的一部分,而不是分隔符。

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

这实际上应该是一个单独的问题,但是要加载一个固定值,您可以将列设置为具有默认值并且根本不在控制文件中指定它,或者DEFAULTIF如果您有时可能想要覆盖它,则可以选择使用子句;或者更简单地使用 SQL 字符串来获取值。修改表定义以包含一个load_date字段(并将第一列名称从 更改numberid,这不是保留字,并将其设为 type 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.
于 2013-08-21T08:11:22.983 回答