Pelo que entendi, sua sequência já está ordenada e apenas remove um item da sequencia, o que pode ser resolvido da forma simples como você fez, em complexidade linear de N (para poucos registros).
Porém se é mais complexa a ordenação ou se a quantidade de registros for grande sugiro implementar o quick sort.
Iniciei os trabalhos para fazer a ordenação. Sabe se tem algum comando :system que consigo pegar o campo especifico.
Estou fazendo a primeira parte de ordenar na inserção. Estou fazendo no when-new-record-instance.
Depois vou usar algum gatilho para quando remover reorganizar.
DECLARE
max_sequencia_producao number;
sequencia number;
BEGIN
max_sequencia_producao := 0;
loop
sequencia := :system.trigger_record; -- errado
if nvl(sequencia,0) >= max_sequencia_producao then
max_sequencia_producao := nvl(sequencia,0);
if :comp.sequencia_producao is null then
:comp.sequencia_producao := max_sequencia_producao+1;
end if;
end if;
exit when :system.last_record = 'TRUE';
next_record;
end loop;
END;
Isso tudo estou fazendo na tela antes da inserção no banco.
declare
a number;
begin
select count(ordem)
into a
from trast_item
where cod_rast = :trast_item.cod_rast
and ordem > :trast_item.ordem;
if a > 0 then
declare cursor x is select cod_rast_item,ordem
from trast_item
where cod_rast = :trast_item.cod_rast
and ordem > :trast_item.ordem
order by ordem;
begin
for xx in x loop
update trast_item set ordem = ordem - 1 where cod_rast_item = xx.cod_rast_item;
end loop;
end;
end if;
end;