Flashback Query

2018年2月28日 579点热度 0人点赞 0条评论

■■■Flashback Query
以表为单位查询过去的数据称为闪回查询,主要有两种方式:闪回时间点查询、闪回版本查询
■■闪回时间点查询
利用select命令的“as of”子句与PL/SQL包dbms_flashback在过去的一个时间点上的查询。
SELECT * FROM tb AS OF TIMESTAMP to_timestamp('2018-02-28 10:37:00', 'yyyy-mm-dd hh24:mi:ss');
SELECT * FROM tb AS OF TIMESTAMP (SYSTIMESTAMP - interval '15' minute);
SELECT * FROM tb AS OF SCN 1095000;
利用dbms_flashback包的enable_at_time或enable_at_scn存储过程锁定一个会话级别的闪回时间目标,即进入闪回模式,随后的查询命令可以省略“as of”,直到调用dbms_flashback_disable存储过程将其关闭为止。
比如,将闪回模式会话定格在15分钟前:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);
现在进行查询,注意,此时查询的是15分钟之前的表。
此时若访问SYSDATE、SYSTIMESTAMP等日期函数,它们的返回值仍是当前值,而不是15分钟之前的值。
处于闪回会话模式时,执行dml和ddl将报错
查询完毕,调用disable存储过程关闭闪回会话模式。
SQL> exec dbms_flashback.disable;
■■闪回版本查询
利用select命令的“versions between”子句在过去的一段时间范围内的查询。
闪回版本查询可以贯穿一定长度的时间窗口,通过只使用一条查询命令就能返回该时间窗口内不同时间点上的数据。
通过“versions between”,我们可以看到在15分钟之内,7788号员工的工资有4个值,说明共有3个事务对其进行过修改。为了能看清这些事务的先后顺序,可以在查询列表中使用伪字段。如下所示:

SELECT versions_xid, versions_startscn, versions_endscn, empno, sal
  FROM emp versions BETWEEN TIMESTAMP(systimestamp - INTERVAL '15' minute) AND maxvalue
 WHERE empno = 7788
 ORDER BY 2 NULLS FIRST;
VERSIONS_XID     VERSIONS_STARTSCN VERSIONS_ENDSCN EMPNO    SAL
---------------- ----------------- --------------- ----- ----------
060002000F030000                     1097139       7788       4000
02001100FB020000       1097139       1097148       7788       5000
03001D001E030000       1097148       1097153       7788      10000
                       1097153                     7788       3000

 

liking

我是雪人

文章评论