Подгрузка большого количества данных из csv
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
nobel Профи
Вступление в Клуб: 28.09.2011
|
Пт Дек 26, 2014 10:04  Подгрузка большого количества данных из csv |
|
Полезность: Нет оценки
|
У нас в банке начале использовать приложение "Контроль недействительных удостоверений".Суть в том что с сайта ФМС скачиваем файл с большим количеством данных(форма csv,количество записей порядка 89 млн) и необходимо его уложить нормально как раз в справочник "Перечь недействительных удостоверений".Первый раз его подгрузили нормально перед запуском данного приложения.Теперь большой вопрос как в боевом порядке его можно обновлять.
Есть два варианта в выходные дни запускать подгрузку данных и с полной очисткой данного справочника(полная очистка как в файликах ФМС встречаются большое ошибочно включенных паспортов).
Либо сделать временную структуру,туда подгружать файл а потом ночью запускать операцию по подгрузке данных с временной таблицы на рабочую(тоже полная очистка рабочей таблицы).
Кто может подсказать дельный совет по данному вопросу?
P.S.:пробовал в операцию включить запрос "truncate table"(с указание таблицы конечно) и включением расширенного синтаксиса(и обрамление блоком "-- begin pl/sql" и "-- end pl/sql") но все равно не хочет компилировать операцию так как запрос TRUNCATE не определяется как ключевое слово.
Касательно второго варианта то не хочет отрабатывать и на 8 млн записей вылетает с ошибкой "ORA-01555: слишком старый снимок: сегмент отката номер по имени "" слишком мал"(хоть по словам админа под UNDO выделоно 4 ГБ)
Код: |
n_total:=0;
for xx in ::[CERT_INVALID_TMP]
loop
begin
cert := ::[CERT_INVALID].[NEW#AUTO](
null --Вид документа
,null --Страна выдачи документа
,xx.[SER] --Серия документа
,xx.[NUM] --Номер документа
,null --ФИО владельца документа
,null --Дата рождения
,null --Кем выдан
,null --Номер приказа о признании документа недействительным
,null --Дата приказа о признании документа недействительным
,null --Номер приказа о снятии документа с розыска
,null --Дата приказа о снятии документа с розыска
,null --Примечание
,true --Импортировано
,null --Номер записи по порядку
,null --Признак снятия с розыска документа
,null --Вид документа
,null --Страна выдачи документа
,null --Основание для розыска документа
,null
,null
);
n_ins := n_ins + 1;
exception when others then debug_pipe('Строка '||to_char(n_total)||' пропущена. Причина - '||sqlerrm||' Данные-'||xx.[SER]||' '||xx.[NUM], 0);
end;
if mod(n_total, 500) = 0 then
debug_pipe(' Обработано ' || n_total || ' строк.', 0);
commit;
end if;
n_total:=n_total + 1;
end loop;
|
|
|
|
prankster Профи
Вступление в Клуб: 22.08.2014
|
Пт Дек 26, 2014 11:53   |
|
Полезность: Нет оценки
|
Ну, по поводу truncate - можно использовать execute immediate 'truncate table z#...'. |
|
|
prankster Профи
Вступление в Клуб: 22.08.2014
|
Пт Дек 26, 2014 12:32   |
|
Полезность: Нет оценки
|
p/s сорри, не смотрел сам код, коммит только увидел. В этом случае считайте все элементы ::[CERT_INVALID_TMP] в table of [CERT_INVALID_TMP] и по нему уже цикл (или используйте конструкции, транслирующиеся в forall (или сам forall через вставку)). |
|
|
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пт Дек 26, 2014 15:22   |
|
Полезность: 1
|
nobel пишет: | Есть два варианта в выходные дни запускать подгрузку данных и с полной очисткой данного справочника(полная очистка как в файликах ФМС встречаются большое ошибочно включенных паспортов).
Либо сделать временную структуру,туда подгружать файл а потом ночью запускать операцию по подгрузке данных с временной таблицы на рабочую(тоже полная очистка рабочей таблицы).
Кто может подсказать дельный совет по данному вопросу?
|
посмотри синтаксис create external table - как раз твой случай.
затем я бы сделал create table new#CERT_INVALID as select from <внешняя таблица>;
и тупо drop table z#CERT_INVALID; rename table new#CERT_INVALID to z#CERT_INVALID;
Естественно, нужно ещё отследить индексы и констрейнты. |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|