Похоже, вы вставляете одну и ту же вещь несколько раз - вы просто зацикливаетесь на count
из dimension_table
, что означает, что его можно упростить до следующего, что будет быстрее.Внизу forall
версия.
Вы не можете использовать exception when dup_val_on_index
с любой версией, вы должны делать это построчно.Судя только по тому, что вы опубликовали, я подозреваю, что вы действительно можете достичь того, что вы пытаетесь сделать в одном запросе, и полностью сохранить всю эту проблему (включая работу с дублирующимися значениями).
declare
i integer;
begin
select count(*)
into i
from dimension_table;
for j in 1 .. i loop
insert into my_table (datakey, sourcekey, description
, dimension_name, someother_column
, some_date_column, login_id
select datakey, sourcekey, description, dimension_name
, data_type, 1, sysdate, login_id -- previously missing
from source_table
where data_type is not null;
end loop;
commit;
end;
/
Еслиоднако вы действительно хотите использовать forall
, вы можете сделать что-то вроде этого:
declare
cursor c_src is
select datakey, sourcekey, description, dimension_name
, data_type, 1, sysdate, login_id -- previously missing
from source_table
where data_type is not null;
type t__src is table of c_src%rowtype index by binary_integer;
t_src t__src;
i integer;
begin
select count(*)
into i
from dimension_table;
for j in 1 .. i loop
open c_src;
loop
fetch c_src bulk collect into t_src;
forall k in t_src.first .. t_src.last
insert into my_table (datakey, sourcekey, description
, dimension_name, someother_column
, some_date_column, login_id
values t_src;
end loop;
close c_src;
end loop;
commit;
end;
/