Som standard er ORA_ROWSCN
gemmes på blokniveau, ikke på rækkeniveau. Den er kun gemt på rækkeniveau, hvis tabellen oprindeligt blev bygget med ROWDEPENDENCIES
aktiveret. Forudsat at du kan passe mange rækker af din tabel i en enkelt blok, og at du ikke bruger APPEND
tip til at indsætte de nye data over det eksisterende højvandsmærke i tabellen, indsætter du sandsynligvis nye data i blokke, der allerede har nogle eksisterende data i dem. Som standard vil det ændre ORA_ROWSCN
af hver række i blokken, hvilket får din forespørgsel til at tælle flere rækker, end der faktisk blev indsat.
Siden ORA_ROWSCN
er kun garanteret en øvre grænse sidste gang, der var DML på en række, ville det være meget mere almindeligt at bestemme, hvor mange rækker der blev indsat i dag ved at tilføje en CREATE_DATE
kolonne til tabellen, der som standard er SYSDATE
eller for at stole på SQL%ROWCOUNT
efter din INSERT
kørte (under forudsætning af, selvfølgelig, at du bruger en enkelt INSERT
sætning for at indsætte alle rækkerne).
Generelt bruger du ORA_ROWSCN
og SCN_TO_TIMESTAMP
funktion vil være en problematisk måde at identificere, hvornår en række blev indsat, selvom tabellen er bygget med ROWDEPENDENCIES
. ORA_ROWSCN
returnerer et Oracle SCN, som er et systemændringsnummer. Dette er en unik identifikator for en bestemt ændring (dvs. en transaktion). Som sådan er der ingen direkte forbindelse mellem et SCN og et tidspunkt - min database genererer muligvis SCN'er en million gange hurtigere end din, og min SCN 1 kan være år forskellig fra din SCN 1. Oracle-baggrundsprocessen SMON
vedligeholder en tabel, der kortlægger SCN-værdier til omtrentlige tidsstempler, men den vedligeholder kun disse data i en begrænset periode - ellers ville din database ende med en tabel med flere milliarder rækker, der blot lagrede SCN til tidsstempler. Hvis rækken blev indsat for mere end f.eks. en uge siden (og den nøjagtige grænse afhænger af databasen og databaseversionen), SCN_TO_TIMESTAMP
vil ikke være i stand til at konvertere SCN til et tidsstempel og vil returnere en fejl.