Загрузчик SQL: загрузка в 2 таблицы из 1 файла управления и 1 файла CSV - PullRequest
6 голосов
/ 01 апреля 2009

Таблица T1 Структура: номер col1, номер col2

Таблица T2 Структура: номер col1, номер col2, номер col3

CSV-файл:

row1:1,2,3,4,5,6
row2:1,2,3,4,5,6

Я хочу данные в таблице T1 как:

col1   col2
=====  ====
1       3
1       3

Я хочу данные в таблице T2 как:

col1   col2   col3
=====  ====   ==== 
1       3       5
1       3       5

следующий контрольный файл не работает

load data
infile *
insert into table T1 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill1 filler,col2)
insert into table T2 fields terminated by ',' TRAILING NULLCOLS
(col1,fill2 filler,col2,fill3 filler,col3)
begindata
1,2,3,4,5,6
1,2,3,4,5,6

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2009

Это работает, но мне не нравится это решение. Я предпочитаю использовать внешние таблицы в этих ситуациях. Краткий ответ: у вас возникли проблемы, потому что SQLLDR автоматически не сканирует данные при импорте нескольких строк. Ниже приведен фрагмент из документации.

Из документации SQLLDR

Использование POSITION с несколькими загрузками таблиц

При загрузке нескольких таблиц вы указываете несколько предложений INTO TABLE. Когда вы указываете POSITION () для первого столбца первой таблицы, позиция вычисляется относительно начала логической записи. Когда вы указываете POSITION () для первого столбца последующих таблиц, позиция рассчитывается относительно последнего столбца последней загруженной таблицы.

Таким образом, когда начинается последующее предложение INTO TABLE, позиция не устанавливается автоматически в начало логической записи. Это позволяет нескольким предложениям INTO TABLE обрабатывать разные части одной и той же физической записи. Пример см. В разделе «Извлечение нескольких логических записей».

Логическая запись может содержать данные для одной из двух таблиц, но не для обеих. В этом случае вы бы сбросили ПОЛОЖЕНИЕ. Вместо того чтобы опускать спецификацию позиции или использовать POSITION (* + n) для первого поля в предложении INTO TABLE, используйте POSITION (1) или POSITION (n).

    load data
    infile * 
    truncate
    into table T1 
    fields terminated by ',' trailing nullcols
    ( col1  
    , fill1 filler
    , col2  )
    into table T2 
    fields terminated by ','  trailing nullcols
    ( col1 position(1) 
    , filler filler
    , col2    
    , filler2 filler
    , col3 )   

BEGINDATA
1,2,3,4,5,6
1,2,3,4,5,6

SQL> select * From t1;

      COL1       COL2
---------- ----------
         1          3
         1          3

SQL> select* From t2;

      COL1       COL2       COL3
---------- ---------- ----------
         1          3          5
         1          3          5
2 голосов
/ 13 декабря 2010

Попробуйте это

LOAD DATA  
INFILE * "STR '|EndRec|'"  
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER)  
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(COL1 POSITION(1), FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER)

BEGINDATA  
1,2,3,4,5,6|EndRec|1,2,3,4,5,6|EndRec|
0 голосов
/ 01 апреля 2009

Попробуйте это:

LOAD DATA
INFILE *
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER)
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(COL1, FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER)
BEGINDATA
1,2,3,4,5,6
1,2,3,4,5,6
...