Per impostazione predefinita, ORA_ROWSCN
viene memorizzato a livello di blocco, non a livello di riga. Viene memorizzato solo a livello di riga se la tabella è stata originariamente creata con ROWDEPENDENCIES
abilitato. Supponendo che tu possa inserire molte righe della tua tabella in un unico blocco e che non stai usando APPEND
suggerimento per inserire i nuovi dati sopra l'high water mark esistente della tabella, è probabile che tu stia inserendo nuovi dati in blocchi che contengono già alcuni dati esistenti. Per impostazione predefinita, ciò cambierà il ORA_ROWSCN
di ogni riga del blocco facendo sì che la tua query conteggi più righe di quante ne siano state effettivamente inserite.
Da ORA_ROWSCN
è garantito che sia un limite superiore solo l'ultima volta che è stato visualizzato DML su una riga, sarebbe molto più comune determinare quante righe sono state inserite oggi aggiungendo un CREATE_DATE
colonna alla tabella che per impostazione predefinita è SYSDATE
o fare affidamento su SQL%ROWCOUNT
dopo il tuo INSERT
eseguito (supponendo, ovviamente, che tu stia utilizzando un singolo INSERT
istruzione per inserire tutte le righe).
In genere, utilizzando il ORA_ROWSCN
e il SCN_TO_TIMESTAMP
funzione sarà un modo problematico per identificare quando è stata inserita una riga anche se la tabella è stata creata con ROWDEPENDENCIES
. ORA_ROWSCN
restituisce un Oracle SCN che è un numero di modifica del sistema. Questo è un identificatore univoco per una particolare modifica (cioè una transazione). Pertanto, non esiste un collegamento diretto tra un SCN e un'ora:il mio database potrebbe generare SCN un milione di volte più rapidamente del tuo e il mio SCN 1 potrebbe essere diverso da quello SCN 1. Il processo in background Oracle SMON
mantiene una tabella che associa i valori SCN a timestamp approssimativi ma mantiene quei dati solo per un periodo di tempo limitato, altrimenti il tuo database finirebbe con una tabella di righe multimiliardari che memorizzava solo SCN per mappature di timestamp. Se la riga è stata inserita più di, diciamo, una settimana fa (e il limite esatto dipende dal database e dalla versione del database), SCN_TO_TIMESTAMP
non sarà in grado di convertire l'SCN in un timestamp e restituirà un errore.