Eu tenho muitas tabelas com um gatilho anexado assim
BEFORE INSERT
ON BRULES
...snip...
if inserting and :new.ID is NULL then
SELECT BRULES_SEQ.nextval into :new.ID FROM DUAL;
end if;
Devido a um estilo de codificação interessante, o aplicativo faz inserções em algumas tabelas com um ID nulo que dispara o gatilho e usa a sequência existente. Para outras tabelas ele pega o ID do registro mais novo e adiciona 1. Neste caso a sequencia não é utilizada e fica fora de sincronia com o número de registros da tabela.
Como saber se o próximo valor de uma sequência é válido para um insert? Eu poderia ler todos os gatilhos para o nome da sequência e, em seguida, fazer algum SQL dinâmico para comparar o ID máximo e o valor atual da sequência, mas parece um pouco desajeitado.
Os valores do PK vêm de diferentes fontes: horríveis. Usar a sequência seria a maneira preferida. Você não pode dizer qual é exatamente o próximo valor para a sequência procurando no dicionário. Há cache em vigor, obviamente por motivos de desempenho. Se você procurar no dicionário, encontrará o valor que é válido depois que o cache ficou sem números. O que você não sabe é até que ponto o cache é usado.
Você pode ignorar o valor pré-inserido para o PK, de forma tão eficaz apenas usando a sequência? A maneira como funciona agora é quase tão ruim quanto consultar o max(pk)+1 da tabela.
Se, por qualquer motivo, você não quiser usar a solução de ik_zelf (preferencial), poderá alterar sua sequência para usar valores negativos. Isso o manteria fora do caminho do código Adicionar 1 até que você possa alterá-lo.