Domyślnie ORA_ROWSCN
jest przechowywany na poziomie bloku, a nie na poziomie wiersza. Jest przechowywany na poziomie wiersza tylko wtedy, gdy tabela została pierwotnie zbudowana przy użyciu ROWDEPENDENCIES
włączony. Zakładając, że możesz zmieścić wiele wierszy tabeli w jednym bloku i że nie używasz APPEND
wskazówka, aby wstawić nowe dane powyżej istniejącego wysokiego znaku wodnego w tabeli, prawdopodobnie wstawiasz nowe dane do bloków, w których są już jakieś istniejące dane. Domyślnie zmieni to ORA_ROWSCN
każdego wiersza w bloku, co powoduje, że zapytanie liczy więcej wierszy, niż zostało faktycznie wstawionych.
Od ORA_ROWSCN
gwarantowane jest tylko górne ograniczenie ostatniego czasu, gdy w wierszu był DML, znacznie częściej byłoby określać, ile wierszy zostało wstawionych dzisiaj, dodając CREATE_DATE
kolumna do tabeli, która domyślnie SYSDATE
lub polegać na SQL%ROWCOUNT
po INSERT
uruchomiony (zakładając oczywiście, że używasz pojedynczego INSERT
oświadczenie, aby wstawić wszystkie wiersze).
Ogólnie, używając ORA_ROWSCN
i SCN_TO_TIMESTAMP
funkcja będzie problematycznym sposobem identyfikowania, kiedy wiersz został wstawiony, nawet jeśli tabela jest zbudowana za pomocą ROWDEPENDENCIES
. ORA_ROWSCN
zwraca Oracle SCN, który jest numerem zmiany systemu. Jest to unikalny identyfikator konkretnej zmiany (tj. transakcji). W związku z tym nie ma bezpośredniego związku między SCN a czasem — moja baza danych może generować SCN milion razy szybciej niż Twoja, a mój SCN 1 może różnić się o lata od twojego SCN 1. Proces Oracle w tle SMON
utrzymuje tabelę, która odwzorowuje wartości SCN na przybliżone znaczniki czasu, ale przechowuje te dane tylko przez ograniczony czas — w przeciwnym razie Twoja baza danych otrzymałaby wielomiliardową tabelę, która po prostu przechowywała odwzorowania SCN na znaczniki czasu. Jeśli wiersz został wstawiony więcej niż, powiedzmy, tydzień temu (a dokładny limit zależy od bazy danych i wersji bazy danych), SCN_TO_TIMESTAMP
nie będzie w stanie przekonwertować SCN na znacznik czasu i zwróci błąd.