Могу обрисовать проблему, может что и посоветуете.
Есть необходимость делать следующее
insert into table1
select pk, ... from ... table11
where table11.dat between d1 and d2
and ...
(Условию "table11.dat between d1 and d2" удовлетворяют около миллиона записей (~50% таблицы))
Затем, по всем только что вставленным pk (уникальным для table1)
loop
insert into table2
select ... from table22
where table22.col1 = pk
and ...;
insert into table3
select ... from table33
where table33.col1 = pk
and ...;
и т.д.
end loop;
Т.к. в insert into ... select ... нельзя использовать returning bulk collect into ..., хотелось сделать все это в виде
cursor c is
select pk, ... from ... table11
where table11.dat between d1 and d2
and ...
open c;
loop
fetch c bulk collect into ... limit N;
insert into table1 values (...) returning pk bulk collect into bc...
forall i in 1..bc.count
insert into table2
select ... from table22
where table22.col1 = bc.pk
and ...;
forall i in 1..bc.count
insert into table3
select ... from table33
where table33.col1 = bc.pk
and ...;
и т.д.
exit when c%notfound;
end loop;
Однако в любом варианте, план запроса в курсоре "c" будет неадекватным (доступ по индексам) из-за переменных привязки.
Поэтому решил открывать его динамически
open c for
'select pk, ... from ... table11
where table11.dat between ' || d1 || ' and ' || d2 ||
'and ...';
Но вот столкнулся с тем, что в 8.1.7 так нельзя в сочетании с "fetch c bulk collect into ...".
Подскажите, как можно проще и правильнее сделать? Чувствую, что можно, но найти способ сам пока не могу.