Загрузить 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 ответ
Необходимо разделить поле, чтобы запятая между двойными кавычками считалась только частью значения, а не разделителем.
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.