Standardmäßig ORA_ROWSCN
wird auf Blockebene gespeichert, nicht auf Zeilenebene. Sie wird nur dann auf Zeilenebene gespeichert, wenn die Tabelle ursprünglich mit ROWDEPENDENCIES
erstellt wurde aktiviert. Angenommen, Sie können viele Zeilen Ihrer Tabelle in einem einzigen Block unterbringen und verwenden nicht das APPEND
Hinweis zum Einfügen der neuen Daten über der vorhandenen oberen Grenze der Tabelle, fügen Sie wahrscheinlich neue Daten in Blöcke ein, die bereits einige vorhandene Daten enthalten. Standardmäßig wird dadurch ORA_ROWSCN
geändert jeder Zeile im Block, was dazu führt, dass Ihre Abfrage mehr Zeilen zählt, als tatsächlich eingefügt wurden.
Seit ORA_ROWSCN
garantiert nur eine Obergrenze für das letzte Mal, als DML in einer Zeile vorhanden war, wäre es viel üblicher, zu bestimmen, wie viele Zeilen heute eingefügt wurden, indem ein CREATE_DATE
hinzugefügt wird Spalte in die Tabelle, die standardmäßig SYSDATE
ist oder sich auf SQL%ROWCOUNT
zu verlassen nach Ihrem INSERT
ausgeführt (vorausgesetzt natürlich, Sie verwenden ein einzelnes INSERT
Anweisung zum Einfügen aller Zeilen).
Im Allgemeinen mit dem ORA_ROWSCN
und der SCN_TO_TIMESTAMP
-Funktion wird eine problematische Methode sein, um zu identifizieren, wann eine Zeile eingefügt wurde, selbst wenn die Tabelle mit ROWDEPENDENCIES
erstellt wurde . ORA_ROWSCN
gibt eine Oracle-SCN zurück, die eine Systemänderungsnummer ist. Dies ist eine eindeutige Kennung für eine bestimmte Änderung (z. B. eine Transaktion). Daher gibt es keine direkte Verbindung zwischen einem SCN und einer Zeit – meine Datenbank generiert SCNs möglicherweise millionenfach schneller als Ihre, und mein SCN 1 unterscheidet sich möglicherweise um Jahre von Ihrem SCN 1. Der Oracle-Hintergrundprozess SMON
verwaltet eine Tabelle, die SCN-Werte ungefähren Zeitstempeln zuordnet, aber diese Daten werden nur für einen begrenzten Zeitraum aufbewahrt - andernfalls würde Ihre Datenbank am Ende eine Tabelle mit mehreren Milliarden Zeilen enthalten, die nur SCN-zu-Zeitstempel-Zuordnungen speichert. Wenn die Zeile vor mehr als beispielsweise einer Woche eingefügt wurde (und das genaue Limit von der Datenbank und der Datenbankversion abhängt), SCN_TO_TIMESTAMP
kann den SCN nicht in einen Zeitstempel umwandeln und gibt einen Fehler zurück.