Flashback Query

■■■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个事务对其进行过修改。为了能看清这些事务的先后顺序,可以在查询列表中使用伪字段。如下所示:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注