Возможность пропуска Oracle Sql Loader для нескольких инфилей - PullRequest
5 голосов
/ 29 июня 2011

При использовании файла управления SQL Loader следующим образом:

OPTIONS(**skip=1**,bindsize=1048576,rows=1024)
LOAD DATA
INFILE 'C:\Documents and Settings\FIRST.CSV'
INFILE 'C:\Documents and Settings\SECOND.CSV'
APPEND
INTO TABLE table_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  TRAILING NULLCOLS
(
fields
)

пропускает строку заголовка для файла FIRST.CSV, но загружает строку заголовка из SECOND.CSV в таблицу Oracle. Мое решение состоит в том, чтобы разбить этот контрольный файл на два отдельных файла. Можно ли выполнить один контрольный файл?

1 Ответ

6 голосов
/ 01 июля 2011

Вы можете сделать с одним контрольным файлом, но для этого все равно потребуется дважды запустить sqlldr:

Контрольный файл:

OPTIONS(skip=1,bindsize=1048576,rows=1024)
LOAD DATA
APPEND
INTO TABLE table_name
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(
  fields
)

А затем запустите sqlldr следующим образом:

sqlldr control=control.ctl data=FIRST.CSV
sqlldr control=control.ctl data=SECOND.CSV

Другой вариант, который мне только что пришёл в голову, заключается в том, что вы можете проверить запись с помощью предложения WHEN:

OPTIONS(bindsize=1048576,rows=1024)
LOAD DATA
INFILE 'C:\Documents and Settings\FIRST.CSV'
INFILE 'C:\Documents and Settings\SECOND.CSV'
APPEND
INTO TABLE table_name
WHEN (field1 <> 'ContentsOfField1InHeaderRow')
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(
  fields
)

Если ваш заголовок всегда содержит фиксированный текст, вы можете пропустить его в зависимости от содержимого (одного из) полей. Однако использование WHEN может повлиять на производительность - в зависимости от размера файлов вам может быть лучше сделать два вызова sqlldr.

...