Pegar o momento de uma inserção através do SCN

Olá pessoal,
me deparei estes dias com uma situação interessante. Um colega precisava descobrir o momento exato em que houve uma determinada inserção de um registro em uma tabela de movimentos de estoque de um cliente, mas o único campo de data da tabela guardava apenas dia/mês/ano, sem a hora.
O Oracle não trabalha com datas diretamente em seus controles, pois a data do sistema operacional pode ser alterada e comprometer a sua consistência. Desta forma ele utiliza um número sequencial conhecido como SCN. Aí imaginei que houvésse uma forma de converter este SCN para um horário válido e fiz a seguinte pesquisa no banco, como usuário sys:

select object_name
from all_objects
where upper(object_name) like '%SCN%'

Esta consulta me retornou vários resultados, dentre eles o que chamou a atenção foi o SCN_TO_TIMESTAMP. Pesquisei no Google e verifiquei o uso desta função com a pseudo-coluna ORA_ROWSCN que armazena o SCN corrente no momento da inclusão do novo registro. Com isso utilizei o simples comando abaixo para me trazer a data e hora da inclusão do registro:

select movimento,
dt_movimento,
ora_rowscn,
scn_to_timestamp(ora_rowscn) data_e_hora
from movimento_estoque
where movimento = 165701

E o resultado foi o seguinte:

MOVIMENTO DT_MOVIMENTO ORA_ROWSCN DATA_E_HORA

------------ ------------- ----------- ---------------------------
165701 15/12/06 95200613 14/03/08 08:09:51,000000000


Desta forma a o horário pode ser recuperado, talvez com alguns décimos de segundo de diferença com o horário real.

Comentários

Postagens mais visitadas deste blog

[Openfire] - Ajuste de horário no cliente Spark

Verificar uso de disco em partição ASM do Oracle 11g no Linux

[Kettle] - Ajuste de Memória de Utilização