Как вы можете видеть, прочитав другие ответы, доступно множество вариантов. Если вы просто делаете <10k строк, вам следует перейти ко второму варианту. </p>
Короче говоря, для приблизительно> 10 000, вплоть до <100 000. Это своего рода серая зона. Многие старые старички будут лаять на больших отрезках отката. Но, честно говоря, аппаратное и программное обеспечение значительно продвинулись в том, что вы можете выбрать вариант 2 для большого количества записей, если будете запускать код только несколько раз. В противном случае вы, вероятно, должны фиксировать каждые 1k-10k или около того строк. Вот фрагмент, который я использую. Мне это нравится, потому что оно короткое, и мне не нужно объявлять курсор. Кроме того, он обладает преимуществами массового сбора и сбора. </p>
begin
for r in (select rownum rn, t.* from foo t) loop
insert into bar (A,B,C) values (r.A,r.B,r.C);
if mod(rn,1000)=0 then
commit;
end if;
end;
commit;
end;
Я нашел эту ссылку с сайта оракула, которая более подробно иллюстрирует варианты.