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.
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