Вам не нужно использовать курсоры (или коллекции, более реалистично) или даже любой PL / SQL здесь. Вы можете вставить данные в таблицу перед вашим шагом «Выполнение DML», а затем обновить, если впоследствии, например, с помощью слияния:
-- initial population
insert into tab_abc (id, inv_bfr, descr, inv_afr)
select id, count(*) as inv_bfr, descr, 0 as inv_after
from tab_a
group by id, descr;
-- intermediate DML operation
-- post-DML update
merge into tab_abc t
using (
select id, 0 as inv_bfr, descr, count(*) as inv_afr
from tab_a
group by id, descr
) afr
on (afr.id = t.id and afr.descr = t.descr)
when matched then
update set inv_afr = afr.inv_afr
when not matched then
insert (id, inv_bfr, descr, inv_afr)
values (afr.id, afr.inv_bfr, afr.descr, afr.inv_afr);
Все это можно обернуть в блок PL / SQL конечно, если вам нужно по другим причинам.
db <> fiddle demo с несколькими вымышленными строками.