2016-07-05 2 views
0

1-й вопрос: Я пытаюсь загрузить test1.csv, test2.csv и test3.csv к table1, table2 и Таблица3 используя SQLLDR. Пожалуйста, несите мои недостатки, если вы владеете знаниями в этой области, я не мог понять это правильно, определяя это в .ctl-файле, только я могу думать о нижеприведенном коде, но это неверно. поэтому мой вопрос в том, как я могу сделать это правильно или это возможно?SQLLDR - как загрузить несколько CSV для multple таблицы

OPTIONS (SKIP=1) 
LOAD DATA 

INFILE 'test1.csv' 
INFILE 'test2.csv' 
INFILE 'test2.csv' 

TRUNCATE 

INTO TABLE table1 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 


INTO TABLE table2 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

2-й вопрос: Это альтернатива этому первому вопросу. Поскольку я не мог понять, что первый, то, что я сделал, разбивает нагрузки для каждой таблицы на несколько .ctl-файлов и вызывает их все три в .bat-файле. Это работает, по крайней мере, но мой вопрос заключается в способе обработки всех этих 3 .ctl-файлов в сеансе без упоминания пользователя/пароля 3 раза, как показано ниже.

sqlldr userid=user/[email protected] control=test1.ctl 
sqlldr userid=user/[email protected] control=test2.ctl 
sqlldr userid=user/[email protected] control=test3.ctl 
+0

Есть ли в базе данных данные, которые могут быть использованы для ввода таблицы, на которую должны направляться данные? –

+0

Я не использовал ни одного столбца в качестве ключа, чтобы отличать данные, но я могу попробовать, добавив ключ. – Chito

ответ

0

Если есть поле, которое можно использовать, которые могут указать, какие таблицы, что данные файла предназначен для, вы можете сделать что-то подобное с использованием нескольких INFILE satements. Скажем, первое поле является то, что показатель, и он не будет загружен (определить его как ЗАПОЛНИТЕЛЬ так SQLLDR проигнорирует):

... 
INTO TABLE table1 
WHEN (01) = 'TBL1' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Col1 "TRIM(:Col1)", 
    Col2 "TRIM(:Col2)" 
) 

INTO TABLE table2 
WHEN (01) = 'TBL2' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colx "TRIM(:Colx)", 
    Coly "TRIM(:Coly)" 
) 


INTO TABLE table3 
WHEN (01) = 'TBL3' 
fields terminated by ',' optionally enclosed by '"' 
TRAILING NULLCOLS 
(
    rec_skip filler POSITION(1), 
    Colp "TRIM(:Colp)", 
    Colq "TRIM(:Colq)" 
) 

Так логически, каждые в таблице Когда раздел обрабатывает каждый файл. Не тот гибкий, хотя и, возможно, сложнее поддерживать. Для простоты обслуживания вы можете просто иметь файл управления для каждого файла? Если все файлы и таблицы имеют один и тот же макет, вы также можете загрузить их все в одну промежуточную таблицу (с индикатором) для удобства загрузки, а затем разделить их программно на отдельные таблицы. Плюсами этого метода являются более быстрая и простая загрузка и больший контроль над разбиением на отдельную часть таблицы процесса. Просто некоторые другие идеи. Я сделал каждый метод, в зависимости от требований и того, что вы можете изменить.

+0

Я получил то, что вы говорите, вероятно, лучше всего держать их в стороне. – Chito

+0

Возвращаясь к второму вопросу, есть ли способ добавить несколько .ctl-файлов, кроме приведенного выше примера? – Chito

+0

Одним из аргументов командной строки, которые вы можете предоставить 'sqlldr', является файл параметров, который может содержать информацию о пользователе. Тем не менее, это связано с собственными проблемами безопасности. См. Здесь для получения дополнительной информации: http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_params.htm#i1005781. В противном случае, я думаю, вам придется программировать метод вызова 'sqlldr', передавая ему разные параметры каждый раз. Это то, что мы делаем. У нас есть таблица, содержащая настройки загрузки для каждого файла, и планировщик читает это, строит командную строку и запускает ее. –