Standaard ORA_ROWSCN
wordt opgeslagen op blokniveau, niet op rijniveau. Het wordt alleen op rijniveau opgeslagen als de tabel oorspronkelijk is gebouwd met ROWDEPENDENCIES
ingeschakeld. Ervan uitgaande dat u veel rijen van uw tabel in een enkel blok kunt plaatsen en dat u de APPEND
niet gebruikt hint om de nieuwe gegevens boven de bestaande hoogwatermarkering van de tabel in te voegen, voegt u waarschijnlijk nieuwe gegevens in blokken in die al een aantal bestaande gegevens bevatten. Standaard verandert dat de ORA_ROWSCN
van elke rij in het blok waardoor uw zoekopdracht meer rijen telt dan er daadwerkelijk zijn ingevoegd.
Sinds ORA_ROWSCN
alleen gegarandeerd een bovengrens is voor de laatste keer dat er DML op een rij was, zou het veel gebruikelijker zijn om te bepalen hoeveel rijen er vandaag zijn ingevoegd door een CREATE_DATE
toe te voegen kolom naar de tabel die standaard is ingesteld op SYSDATE
of om te vertrouwen op SQL%ROWCOUNT
na uw INSERT
liep (ervan uitgaande natuurlijk dat u een enkele INSERT
gebruikt statement om alle rijen in te voegen).
Over het algemeen gebruikt u de ORA_ROWSCN
en de SCN_TO_TIMESTAMP
functie zal een problematische manier zijn om te identificeren wanneer een rij is ingevoegd, zelfs als de tabel is gebouwd met ROWDEPENDENCIES
. ORA_ROWSCN
retourneert een Oracle SCN dat een systeemwijzigingsnummer is. Dit is een unieke identificatiecode voor een bepaalde wijziging (d.w.z. een transactie). Als zodanig is er geen directe link tussen een SCN en een tijd - mijn database genereert mogelijk een miljoen keer sneller SCN's dan de uwe en mijn SCN 1 kan jaren verschillen van uw SCN 1. Het Oracle-achtergrondproces SMON
onderhoudt een tabel die SCN-waarden toewijst om tijdstempels te benaderen, maar het handhaaft die gegevens slechts voor een beperkte periode - anders zou uw database eindigen met een rijentabel van meerdere miljarden die alleen SCN opsloeg naar tijdstempeltoewijzingen. Als de rij meer dan bijvoorbeeld een week geleden is ingevoegd (en de exacte limiet hangt af van de database en databaseversie), SCN_TO_TIMESTAMP
kan de SCN niet converteren naar een tijdstempel en geeft een foutmelding.