По подразбиране, ORA_ROWSCN
се съхранява на ниво блок, а не на ниво ред. Съхранява се само на ниво ред, ако таблицата първоначално е изградена с ROWDEPENDENCIES
активиран. Ако приемем, че можете да поберете много редове от вашата таблица в един блок и че не използвате APPEND
намек за вмъкване на новите данни над съществуващия знак за висока вода на таблицата, вероятно вмъквате нови данни в блокове, които вече имат някои съществуващи данни в тях. По подразбиране това ще промени ORA_ROWSCN
на всеки ред в блока, което кара вашата заявка да брои повече редове, отколкото са били вмъкнати в действителност.
От ORA_ROWSCN
гарантирано е само горна граница за последния път, когато е имало DML на ред, би било много по-често да се определя колко реда са били вмъкнати днес чрез добавяне на CREATE_DATE
колона към таблицата, която по подразбиране е SYSDATE
или да разчитате на SQL%ROWCOUNT
след вашия INSERT
стартира (ако приемем, разбира се, че използвате един INSERT
оператор за вмъкване на всички редове).
Като цяло, използвайки ORA_ROWSCN
и SCN_TO_TIMESTAMP
функция ще бъде проблематичен начин за идентифициране кога е вмъкнат ред, дори ако таблицата е изградена с ROWDEPENDENCIES
. ORA_ROWSCN
връща Oracle SCN, който е номер на системна промяна. Това е уникален идентификатор за конкретна промяна (т.е. транзакция). Като такава, няма пряка връзка между SCN и време - моята база данни може да генерира SCN милион пъти по-бързо от вашата и моят SCN 1 може да е с години различен от вашия SCN 1. Фоновият процес на Oracle SMON
поддържа таблица, която картографира SCN стойности към приблизителни времеви клейма, но поддържа тези данни само за ограничен период от време-- в противен случай вашата база данни ще завърши с многомилиардна таблица с редове, която просто съхранява SCN към времеви клейма. Ако редът е вмъкнат преди повече от, да речем, седмица (и точното ограничение зависи от базата данни и версията на базата данни), SCN_TO_TIMESTAMP
няма да може да преобразува SCN в клеймо за време и ще върне грешка.