Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Chamada SQL Número máximo de linhas de uma tabela temporária


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:
  1. 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.
  2. 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.
  3. 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:
  1. rename TEMP_TABLE to whatever;
  2. create table TEMP_TABLE as select * from whatever rowdependencies;
  3. 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.