Come utilizzare Timestamp_to_scn e Scn_to_timestamp in Oracle?

Ho questo come risultato della query:

select cast(to_date(a.start_time,'mm/dd/yyyy hh:mi:ss pm') as timestamp) date_of_call, ora_rowscn from calling_table a where rownum <= 10; DATE_OF_CALLING ORA_ROWSCN 26-JUL-13 12.29.28.000000000 PM 8347567733892 26-JUL-13 12.29.35.000000000 PM 8347567733892 26-JUL-13 12.29.35.000000000 PM 8347567733892 26-JUL-13 12.29.38.000000000 PM 8347567733892 26-JUL-13 12.29.44.000000000 PM 8347567733892 26-JUL-13 12.29.47.000000000 PM 8347567733892 26-JUL-13 12.29.48.000000000 PM 8347567733892 26-JUL-13 12.29.48.000000000 PM 8347567733892 26-JUL-13 12.29.48.000000000 PM 8347567733892 26-JUL-13 12.29.56.000000000 PM 8347567733892 

Ma quando provo a convertire questo timestamp in scn usando la funzione timestamp_to_scn, sto ottenendo il seguente errore:

ORA-08180: nessuna snapshot trovata in base al tempo specificato ORA-06512: a “SYS.TIMESTAMP_TO_SCN”, riga 1 08180. 00000 – “Nessuna snapshot trovata in base all’ora specificata” * Causa: Non può corrispondere l’ora a un SCN dal tabella di mapping. * Azione: prova a utilizzare un tempo più ampio.

E quando sto usando scn_to_timestamp su ora_rowscn per convertire quella colonna in un timestamp, sto ricevendo il seguente errore:

ORA-08181: il numero specificato non è un numero di modifica del sistema valido ORA-06512: in “SYS.SCN_TO_TIMESTAMP”, riga 1 08181. 00000 – “il numero specificato non è un numero di modifica del sistema valido” * Causa: scn fornito non è stato oltre i limiti di una scn valida * Azione: usa uno scn valido.

Che cosa sto facendo di sbagliato?

Stai cercando di guardare troppo indietro. È ansible convertire solo e da SCN presenti nella finestra di ripristino / flashback gestita dal sistema. Una volta che le modifiche cambiano, la mapping viene persa.

Questo è spiegato nella documentazione :

L’associazione tra un SCN e un timestamp quando viene generata la SCN viene ricordata dal database per un periodo limitato di tempo. Questo periodo è il massimo del periodo di conservazione degli annullamenti auto-regolato, se il database viene eseguito in modalità di annullamento automatico della gestione e i tempi di conservazione di tutti gli archivi di flashback nel database, ma non meno di 120 ore. Il tempo per l’associazione diventare obsoleto trascorre solo quando il database è aperto. Viene restituito un errore se la SCN specificata per l’argomento su SCN_TO_TIMESTAMP è troppo vecchia.

Tenete presente che questi sono parte del meccanismo interno di Oracle, e quindi sono di uso limitato per noi; anche se sono utili per le query di flashback, ovviamente, sempre all’interno della stessa finestra.

Imposta UNDO_MANAGEMENT su AUTO e UNDO_RETENTION su valore che coprirà il periodo della tua query più lunga indietro nel tempo. Impostare inoltre GARANZIA DI RITENZIONE per impedire la sovrascrittura di UNDO.

Per Oracle 10g non è ansible eseguire il flashback per più di 5 giorni. Questo è un limite hard coded. Per Oracle 11g non ci sono limiti.