2016-03-08 2 views
1

Например, в файле подачи я получил такие данныеSQL - Загрузка данных с использованием ОТМЕНЯЛОСЬ в другую таблицу

HEADER|AB|C|DATAHERE 
DETAIL|DATA1|DATA2|DATA3 
DETAIL|DATA1|DATA2|DATA3 
DETAIL|DATA1|DATA2|DATA3 
DETAIL|DATA1|DATA2|DATA3 
FOOTER|COUNTER 

линии следует вставить в tableHeader линии 2 к линии 5 следует вставить в tableDetail и последняя строка должна вставить в tableFooter

здесь мне sqlloader сценарий

Load DATA 
REPLACE INTO TABLE tableHeader 
WHEN (1:6) = 'HEADER' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    COL1 FILLER, 
    COL2 FILLER, 
    COL3 FILLER, 
    HEADER_DETAIL, 
) 


INTO TABLE tableDetail 
WHEN (1:6) = 'DETAIL' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    A FILLER, 
    DATA1, 
    DATA2, 
    DATA3 
) 

INTO TABLE tableFooter 
WHEN (1:6) = 'FOOTER' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    Z FILLER, 
    FOOTER_DETAIL 
) 

данные, вставленные в tableHeader, верны, но вставка данных в другую таблицу - все в порядке ... может ли кто-нибудь дать мне руку на это?

+0

«все идут беспорядок» не очень полезно. Добавьте таблицу DDL и то, что фактически вставлено в каждую таблицу. –

+0

, например, для данных таблицы, вставленные данные в столбце DATA1 равны null, столбец DATA2 - DATA1, данные в столбце DATA3 - DATA2 – Jack

+0

на самом деле ... это может быть все null .... очень сложно описать ... потому что данные тестирования экстента различаются с ответом образца i, но могут подтвердить, что данные, отличные от первых данных таблицы, верны, остальные данные таблицы (tableDetails и tableFooter в этом примере) являются неправильным отображением. – Jack

ответ

1

Сводная логическая запись сбита. Это mentioned in the documentation:

... Полевое сканирование не начинается с начала записи для нового предложения INTO TABLE. Вместо этого сканирование продолжается там, где оно остановилось.

Чтобы принудительно запустить сканирование сканирования в определенном месте, вы используете параметр POSITION.

Таким образом, вы можете определить первую длину наполнителя поля с POSITION(1:7):

LOAD DATA 
REPLACE INTO TABLE tableHeader 
WHEN (1:6) = 'HEADER' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    COL1 FILLER, 
    COL2 FILLER, 
    COL3 FILLER, 
    HEADER_DETAIL 
) 
INTO TABLE tableDetail 
WHEN (1:6) = 'DETAIL' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    A FILLER POSITION(1:7), 
    DATA1, 
    DATA2, 
    DATA3 
) 
INTO TABLE tableFooter 
WHEN (1:6) = 'FOOTER' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    Z FILLER POSITION(1:7), 
    FOOTER_DETAIL 
) 

Это загружает данные образцы в соответствующие поля в некоторых фиктивных таблиц, которые я создал. Без этих спецификаций позиции только заголовок был загружен остальным, отброшенным как все null; с позицией 1: 6 данные попали в неправильные столбцы, и я думаю, это то, что вы описывали.

Вы можете использовать названное поле для WHEN но разделитель может должны быть включены:

LOAD DATA 
REPLACE INTO TABLE tableHeader 
WHEN RECTYPE = 'HEADER|' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    RECTYPE FILLER POSITION(1:7), 
    FILL1 FILLER, 
    FILL2 FILLER, 
    HEADER_DETAIL 
) 
INTO TABLE tableDetail 
WHEN RECTYPE = 'DETAIL|' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    RECTYPE FILLER POSITION(1:7), 
    DATA1, 
    DATA2, 
    DATA3 
) 
INTO TABLE tableFooter 
WHEN RECTYPE = 'FOOTER|' 
FIELDS TERMINATED BY '|' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
(
    RECTYPE FILLER POSITION(1:7), 
    FOOTER_DETAIL 
) 
Смежные вопросы