Проблемы с загрузкой данных через загрузчик SQL

Я столкнулся с некоторыми проблемами при загрузке файла CSV через загрузчик SQL.

Вот контрольный файл:

LOAD DATA 
INFILE 'mp.csv'
BADFILE mp.bad'
INSERT 
INTO TABLE mp_staging
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
mp_id INTEGER,
mp_name CHAR,
mp_desc CHAR,
oid CHAR,
ptye_cd CHAR,
creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",
deact_dt DATE,
)

Вот несколько примеров записей из файла CSV:

1083,"Test3","","mills_b","PRIVATE",2000-12-06 14:29:21.17,1999-12-06 14:29:21.17,2011-    10-01 04:03:44.6

116,"Mike1","","mills_b","PRIVATE",1999-09-15 11:15:29.42,1999-09-15 11:15:59.663,2011-    10-01 04:01:23.923,,0,"F",""

Я столкнулся с двумя проблемами -

  1. Вторая запись вставляется, но с другим mp_id в таблице, так как значение, вставленное в таблицу, не 1083, а совсем другое число, которое, кажется, генерируется последовательностью, хотя я не упоминал ни одной последовательности в контрольный файл.

  2. Первая запись не загружается с такой ошибкой:

Запись 1: отклонено - ошибка в таблице EQ_MP_STAGING, столбец CREATION_TMSTMP. ORA-01841: (полный) год должен быть от -4713 до +9999, а не 0

Может ли кто-нибудь помочь мне в правильном направлении, чтобы я мог отладить эти проблемы?


person Incognito    schedule 22.06.2012    source источник


Ответы (3)


Разделитель между секундами и миллисекундами - это точка в вашем CSV-файле (1999-12-06 14:29:21.17), но запятая в вашем формате (YYYY-MM-DD HH24:MI:SS,FF9)

Я предполагаю, что это может противоречить директиве FIELDS TERMINATED BY ','.

Вы можете это попробовать?

creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9",
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9",
last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS.FF9",
person Pierre Laporte    schedule 22.06.2012
comment
Но почему одна запись загружается, а другая не работает? Хотя я попробовал то, что вы предложили, и все равно получаю ту же ошибку - person Incognito; 22.06.2012
comment
Кстати, это не приводит к сбою перекодирования. Вы можете указать формат через запятую и указать фактические данные через точку, и они загрузятся без каких-либо проблем. Я просто пробовал это! - person Incognito; 22.06.2012

Изменение mp_id предполагает, что у вас есть триггер при вставке в mp_staging таблице, который всегда устанавливает идентификатор из последовательности. Если вам нужна возможность указывать значения идентификаторов, триггер может проверить, является ли переданный :new.mp_id нулевым, и назначить значение последовательности только в том случае, если это так. Вам также необходимо убедиться, что последовательность установлена ​​выше любых значений, которые вы загружаете, иначе вы можете столкнуться с конфликтами позже.

person Alex Poole    schedule 22.06.2012
comment
Да, я так подумал в первый раз. Но в системе нет триггеров. Я только что создал эту временную таблицу для загрузки данных. Кроме того, когда я вставляю запись вручную, идентификатор сохраняется: INSERT INTO mp_staging (mp_id) VALUES (123); Это вставляет запись с MP_ID как 123 - person Incognito; 22.06.2012

Хорошо, я понял ошибку. Все это было связано с определением контрольного файла. Все, что мне нужно было сделать, это удалить объявления типов данных. Насколько я понял, когда вы указываете тип данных, вы должны указать предел поля. Я попытался указать POSITION (*), думая, что это позаботится о полях переменной длины, но снова получил ту же ошибку.

LOAD DATA  
INFILE 'mp.csv' 
BADFILE mp.bad' 
INSERT  INTO TABLE mp_staging
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
( mp_id , 
mp_name , 
mp_desc , 
oid , 
ptye_cd , 
creation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", 
modified_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9",              last_generation_tmstmp TIMESTAMP WITH TIME ZONE "YYYY-MM-DD HH24:MI:SS,FF9", 
deact_dt )
person Incognito    schedule 22.06.2012