CftClub.ru
Клуб специалистов ЦФТ-Банк

Подгрузка большого количества данных из csv

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Настройка и сопровождение
Предыдущая тема :: Следующая тема  
Автор Сообщение
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;

Естественно, нужно ещё отследить индексы и констрейнты.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Настройка и сопровождение Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru