Milton Seguindo a idéia de que você vai efetuar a inserção utilizando o insert (tendo o listagg):
insert into expedicao (produto_id, quantidade, oel_id) select i.produto_id, sum(i.quantidade), listagg(i.item_nota_id, ',') WITHIN GROUP(ORDER BY i.item_nota_id) from itens_da_nota i group by i.produto_id; você pode resolver o problema adicionando uma trigger after insert como segue (não cheguei a testar a trigger): create or replace trigger t_ai_expedicao after insert on expedicao for each row declare v_itens_nota expedicao.itens_nota%type := rtrim(ltrim(:new.itens_nota,','),',')||','; -- deixar a lista no formato 'id1,id2,...,idn,' terminando com um "," begin while v_itens_nota is not null loop update itens_da_nota set retorno = :new.exp_id where item_nota_id = to_number(substr(v_itens_nota,1,instr(v_itens_nota,',')-1)); v_item_nota_id := substr(v_itens_nota,instr(v_itens_nota,',')+1); end loop; end t_ai_expedicao; / Se o teu insert pode ser dentro de uma proc, então poderia fazer um cursor lendo as linhas da tabela itens_da_nota uma a uma (com um for update por exemplo) e para cada "quebra" de produto você pegaria um id da expedicao, inseriria na tabela de expedicao e faria update na itens_da_nota. Abs