Xpoint
   [напомнить пароль]

Добавление записей в БД по определенному количеству

Метки: [без меток]
2006-11-28 12:25:58 [обр] alexabm М[досье]
Здравствуйте, подскажите как лучше всего организовать Insert на определенное количество записей, например загрузил 500 записей, COMMIT,
еще 500, снова COMMIT и т.п. Нужно чтобы новые записи гарантированно не повторялись из старого набора. По идее такую уникальность обеспечивает ROWID, но это не числовое поле, поэтому не могу сообразить как сделать. Заранее благодарю за помощь.
спустя 21 час [обр] GRAy(0/259)[досье]
Нужно чтобы новые записи гарантированно не повторялись из старого набора

Непонятно - приведите пример.

По идее такую уникальность обеспечивает ROWID

ROWID внутреннее дело Oracle, вы никак не сможете на него повлиять. Более того, он генерится для каждой вставляемой записи и никаким образом не определяет их уникальность - для этого есть первичные/уникальные ключи.
Обеспечить пакетную загрузку данных можно с помощью простой процедуры на PL\SQL.

спустя 3 часа 20 минут [обр] alexabm М[досье]

Вся суть в том, что мне нужно грузить данные не INSERT INTO XXX (A,B,C) (SELECT A2,B2,C2 FROM XXX2) - весь набор, где данных может быть ОЧЕНЬ МНОГО,
а:

INSERT INTO XXX (A,B,C) (SELECT A2,B2,C2 FROM XXX2 ... ???); - набор скажем по 500 записей, далее
COMMIT;
Затем снова:

INSERT INTO XXX (A,B,C) (SELECT A2,B2,C2 FROM XXX2 ... ???); - набор по 500 непопавших в первый набор записей, далее
COMMIT;

И т.д., до полной загрузи всех записей из таблицы XXX2.
Как лучше всего это реализовать?

спустя 3 часа 41 минуту [обр] GRAy(0/259)[досье]

Откуда вы их грузите? Из файла? Структура файла регулярная? Если да - поищите информацию по external table. Вот пара ссылок на затравку:
ссылка1
ссылка2
ссылка3
сцылка3
Ну и google вам в помощь.
После того как вы организуете доступ к своим данным как к таблице - загрузить их частями можно уже с помощью примерно такого PL\SQL кода:

declare 
 cursor c1 is
  select * from source_table;
 type tbl is table of c1%rowtype;
 p_tbl tbl;
 i number;
 p_chunk_size number:=500;
begin
  open c1; -- открываем курсор.
  loop 
  fetch c1 bulk collect into p_tbl limit p_chunk_size; -- фетчим по 500 записей в коллекцию.
  exit when c1%notfound; -- выходим из цикла если из курсора ничего достать не удалось (записи кончились)
  forall i in p_tbl.first..p_tbl.last
    insert into target_table values p_tbl(i); -- это будет работать если структура target_table полностью идентична структуре source_table, в противном случае надо заменить "values p_tbl(i)" на "values(p_tbl(i).field1_name,...)"
  commit; -- коммитим наши вставленные 500 записей
  end loop; 
  close c1;
end load_data;

Если это делается на регулярной основе - сделайте из вышеприведённого кода хранимую процедуру и обращайтесь к ней. Стоит так же добавить обработку ошибок, но это вам на домашнее задание ;)

Powered by POEM™ Engine Copyright © 2002-2005