Не знаю, почему у вас проблемы с массовым сбором: это довольно просто.Это становится немного сложнее, когда мы имеем дело с десятками тысяч записей, но вы не говорите, является ли это фактором здесь.В любом случае вам не нужно использовать расширение с массовым сбором.
SQL> SQL> SQL> ed
Wrote file afiedt.buf
1 declare
2 type r_tmp is record
3 ( empno number
4 , deptno number
5 , sal number );
6 type nt_emp is table of r_tmp;
7 emp_recs nt_emp;
8 begin
9 select e.empno
10 , e.deptno
11 , e.sal
12 bulk collect into emp_recs
13 from emp e;
14 dbms_output.put_line('no of recs selected = '||emp_recs.count );
15 forall i in emp_recs.first..emp_recs.last
16 insert into temp_emp
17 values emp_recs(i);
18 dbms_output.put_line('no of recs inserted = '||sql%rowcount );
19* end;
20 /
no of recs selected = 17
no of recs inserted = 17
PL/SQL procedure successfully completed.
SQL>
Как видите, вставка записей из вложенной таблицы, чья подпись соответствует проекту таблицы, очень проста.
Кроме того, если запись действительно соответствует существующей таблице, мы можем объявитьВместо этого вложенная таблица с синтаксисом% ROWTYPE.
1 declare
2 type nt_emp temp_emp%rowtype;
3 emp_recs nt_emp;
4 begin
Bulk Collect и Forall более эффективны, чем обычная реализация RBAR, но они все еще вялые по сравнению с чистым SQL.Поэтому обычно мы будем использовать такую конструкцию только в том случае, если мы предпринимаем некоторые промежуточные манипуляции с данными в массиве, что само по себе не может быть выполнено в SQL.По мере того, как функциональность Oracle в SQL увеличивается с каждым выпуском, становится все реже находить такую необходимость.