2008-12-11 2 views
3

Недавно я узнал, что у oracle есть функция, которая была мне очень полезна, поскольку разработчик/разработчик не очень заботился об истории данных - я могу запросить историческое состояние запись, если она доступна еще в кэше оракула, как это:История записи Oracle с использованием временной метки в диапазоне

select * 
    from (select * 
      from sometable where some_condition) 
as of timestamp sysdate-1 

Но теперь мне нужно проверить исторические данные в пределах диапазона. Можно ли так или иначе использовать кеш?

ответ

8

Да, как это:

SQL> select sal from emp where empno=7369; 

     SAL 
---------- 
     5800 

SQL> update emp set sal = sal+100 where empno=7369; 

1 row updated. 

SQL> commit; 

Commit complete. 

SQL> update emp set sal = sal-100 where empno=7369; 

1 row updated.  

SQL> commit; 

Commit complete. 

SQL> select empno, sal, versions_starttime,versions_xid 
    2 from emp 
    3 versions between timestamp sysdate-1 and sysdate 
    4 where empno=7369; 

    EMPNO  SAL VERSIONS_STARTTIME               VERSIONS_XID 
---------- ---------- --------------------------------------------------------------------------- -- 
     7369  5900 11-DEC-08 16.05.32               0014001300002A74 
     7369  5800 11-DEC-08 16.03.32               000D002200012EB1 
     7369  5800 

Обратите внимание, что, как далеко вы можете пойти ограничен параметром UNDO_RETENTION, и обычно будут часы, а не дни.

0
SELECT * 
    FROM sometable 
    VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp 

предоставит вам все версии всех строк за последний день.

С этим можно многое сделать. Проверьте documentation (вы можете найти документы для своей версии).

2

Следует иметь в виду, что такой запрос флэшбэка опирается на информацию UNDO, которая записывается в табличное пространство UNDO. И эта информация не сохраняется навсегда - в большинстве производственных систем, находящихся под разумной нагрузкой, не будет доступной 24 часа информации UNDO.

В зависимости от версии Oracle вам может потребоваться установить параметр UNDO_RETENTION на значение, превышающее период времени, который вы пытаетесь выполнить.

Смежные вопросы