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值为空,旧版本则有值。