TEMP_TABLE não possui uma chave primária sequencial ou qualquer outro indicador para ordem de inserção. Portanto, não é possível obter o ID mais recente para um LOAD usando as colunas da própria tabela.
No entanto, há uma opção:ORA_ROWSCN() . Esta é uma pseudocoluna que identifica o número de alteração do sistema para a transação que mudou a tabela. Assim, podemos reconstruir a ordem de inserção classificando a tabela em ORA_ROWSCN.
Existem algumas ressalvas:
- Por padrão, o SCN se aplica ao nível do bloco. Conseqüentemente, todas as linhas em um bloco têm o mesmo SCN. É uma aproximação boa o suficiente para mesas largas, mas inútil para um brinquedo de duas colunas como TEMP_TABLE. Podemos rastrear o SCN no nível da linha, mas somente se a tabela for criada com ROWDEPENDENCIES. O padrão é NOROWDEPENDÊNCIAS. Infelizmente, não podemos usar ALTER TABLE aqui. Você precisará descartar e recriar a tabela (*) para ativar ROWDEPENDENCIES.
- O SCN se aplica à transação. Isso significa que a solução só funcionará se cada linha em TEMP_TABLE for inserida em uma transação separada.
- Obviamente, isso só é possível se TEMP_TABLE for uma tabela real e não uma visualização ou alguma outra construção.
Dado que todos esses critérios são satisfeitos, aqui está uma consulta que fornecerá o conjunto de resultados desejado:
select load, id
from ( select load
, id
, row_number() over (partition by load order by ora_rowscn desc) as rn
from temp_table
)
where rn = 1
Existe uma demonstração no db<>fiddle . Além disso, a mesma demonstração, exceto TEMP_TABLE, definida com NOROWDEPENDENCIES, que produz o resultado errado .
(*) Se você precisar manter os dados em TEMP_TABLE as etapas são:
rename TEMP_TABLE to whatever;
create table TEMP_TABLE as select * from whatever rowdependencies;
drop table whatever;
No entanto, o SCN será o mesmo para as linhas existentes. Se isso for importante, você terá que inserir uma linha de cada vez, na ordem que deseja preservar, e confirmar após cada inserção.