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

Entendendo o comportamento ORA_ROWSCN no Oracle


Por padrão, ORA_ROWSCN é armazenado no nível do bloco, não no nível da linha. Ele só é armazenado no nível da linha se a tabela foi originalmente construída com ROWDEPENDENCIES ativado. Assumindo que você pode ajustar muitas linhas de sua tabela em um único bloco e que você não está usando o APPEND dica para inserir os novos dados acima da marca d'água existente na tabela, você provavelmente está inserindo novos dados em blocos que já possuem alguns dados existentes neles. Por padrão, isso mudará o ORA_ROWSCN de cada linha no bloco, fazendo com que sua consulta conte mais linhas do que as realmente inseridas.

Desde ORA_ROWSCN só é garantido para ser um limite superior na última vez que houve DML em uma linha, seria muito mais comum determinar quantas linhas foram inseridas hoje adicionando um CREATE_DATE coluna para a tabela que tem como padrão SYSDATE ou confiar em SQL%ROWCOUNT após o seu INSERT correu (assumindo, é claro, que você está usando um único INSERT instrução para inserir todas as linhas).

Geralmente, usando o ORA_ROWSCN e o SCN_TO_TIMESTAMP será uma maneira problemática de identificar quando uma linha foi inserida, mesmo que a tabela seja construída com ROWDEPENDENCIES . ORA_ROWSCN retorna um Oracle SCN que é um Número de Alteração do Sistema. Este é um identificador exclusivo para uma alteração específica (ou seja, uma transação). Como tal, não há um link direto entre um SCN e um tempo - meu banco de dados pode estar gerando SCNs um milhão de vezes mais rápido que o seu e meu SCN 1 pode ser anos diferente do seu SCN 1. O processo em segundo plano do Oracle SMON mantém uma tabela que mapeia valores de SCN para carimbos de data/hora aproximados, mas mantém esses dados apenas por um período limitado de tempo-- caso contrário, seu banco de dados terminaria com uma tabela de linhas de vários bilhões que estava apenas armazenando SCN para mapeamentos de carimbo de data/hora. Se a linha foi inserida há mais de, digamos, uma semana (e o limite exato depende do banco de dados e da versão do banco de dados), SCN_TO_TIMESTAMP não poderá converter o SCN em um carimbo de data/hora e retornará um erro.