Загрузить CSV с SQLLDR (отклонено)

У меня есть файл 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. во время загрузки можно вставить текущую дату после поля "итого"?

1 ответ

Решение

Необходимо разделить поле, чтобы запятая между двойными кавычками считалась только частью значения, а не разделителем.

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.
Другие вопросы по тегам