Я думаю, что вы ищете отличный вариант использования FORALL.Заполняемую вами коллекцию необходимо выполнить с помощью execute execute, поскольку вы динамически создаете имя таблицы.Но вставка в t_c_rpt_result2 выглядит для меня статичной.
BEGIN
v_sql :=
'(select count(*) as cnt, error_code
from (
select error_code from sm_histable'
|| v_month
|| ''
|| v_day
|| '@ORASMSC01
where orgaccount = :x and destaccount = :x and sm_status <> 1
union all
select error_code from sm_histable'
|| v_month
|| ''
|| v_day
|| '@ORASMSC02
where orgaccount = :x and destaccount = :x and sm_status <> 1 )
group by error_code)';
EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_t1_result USING v_param;
FORALL indx IN 1 .. v_t1_result.COUNT
INSERT INTO t_c_rpt_result2 (err_dt,
err_msg,
errcount,
ERROR_CODE)
VALUES (TRUNC (SYSDATE, 'DD'),
'Failure_error_Code_P2P',
v_t1_result (indx).cnt,
v_t1_result (indx).ERROR_CODE);
END;
Найдите больше примеров FORALL на LiveSQL здесь .Конечно, даже если ваша вставка была динамической, вы можете использовать FORALL - поместить немедленное выполнение непосредственно «внутри» оператора FORALL.Но я не думаю, что сложность здесь оправдана.
Надеюсь, это поможет!