闪回版本查询(Flashback version query)模拟测试

Flashback version query 允许查看相同行在一段时间内所有的版本,记录了数据的历史变化过程。使用Flashback Version Query  返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本
语法如下:

SELECT .....FROM tablename VERSIONS {BETWEEN {SCN | TIMESTAMP} start AND end} 

--start,end可以是时间也可以是scn
Flashback Version Query伪列说明
versions_start{scn|time}  版本开始的scn或时间戳
versions_end{scn|time}  版本结束scn或时间戳,如果有值表明此行后面被更改过是旧版本,如果为null,则说明行版本是当前版本或行被删除(即versions_operation值为D)。
versions_xid 创建行版本的事务ID
versions_operation  在行上执行的操作(I=插入,D=删除,U=更新)
示例说明:

SQL> create table xyc_t1 as select * from scott.emp where 1=2;  --创建表xyc_t1

Table created.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; --查询时间作为timestamp开始时间

TO_DATE(SYSDATE,'
-----------------
20210121 15:59:56

SQL> insert into xyc_t1 select * from scott.emp where empno=7902;   --插入empno=7902

1 row created.

SQL> commit;                                                                               --插入一行提交作为一个版本

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

TO_DATE(SYSDATE,'
-----------------
20210121 16:00:19

SQL> insert into xyc_t1 select * from scott.emp where empno=7788;

1 row created.

SQL> insert into xyc_t1 select * from scott.emp where empno=7698;

1 row created.

SQL> commit;                                                                             --插入两行提交作为一个版本

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;

TO_DATE(SYSDATE,'
-----------------
20210121 16:00:53

SQL> update xyc_t1 set sal=8888 where empno=7788;

1 row updated.

SQL> commit;                                                                          --再次更改empno=7788的行提交,使这行有旧版本

Commit complete.

SQL> select to_date(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; --查询时间作为timestamp结束时间

TO_DATE(SYSDATE,'
-----------------
20210121 16:01:18

select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
from xyc_t1 versions between timestamp to_timestamp('20210121 15:59:56','YYYY-MM-DD HH24:MI:SS') and to_timestamp('20210121 16:01:18','YYYY-MM-DD HH24:MI:SS');

SQL> set line 9999
SQL> select versions_startscn,versions_starttime,versions_endscn,versions_endtime,versions_xid,versions_operation,empno
  2  from xyc_t1 versions between timestamp to_timestamp('20210121 15:59:56','YYYY-MM-DD HH24:MI:SS') and to_timestamp('20210121 16:01:18','YYYY-MM-DD HH24:MI:SS');

VERSIONS_STARTSCN VERSIONS_STARTTIME                                                          VERSIONS_ENDSCN VERSIONS_ENDTIME    VERSIONS_XID      V      EMPNO
----------------- --------------------------------------------------------------------------- --------------- --------------------------------------------------------------------------- ---------------- - ----------
          2167679 21-JAN-21 04.01.11 PM                                                                                           07001D004B040000 U        7788
          2167669 21-JAN-21 04.00.44 PM                                                                                           06000400C9050000 I        7698
          2167669 21-JAN-21 04.00.44 PM                                                               2167679 21-JAN-21 04.01.11 PM                                                        06000400C9050000 I       7788
          2167490 21-JAN-21 04.00.11 PM                                                                                           0300100020050000 I        7902

--可以看出,一次commit是一个版本,当前版本的versions_endscn和versions_endtime值为空,旧版本则有值。

Related Posts