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.