♣
题目部分
在Oracle中,什么是闪回版本查询(Flashback Version Query)?
♣
答案部分
闪回版本查询(Flashback Version Query)是查询过去某个时间段或某个SCN段内表中数据的变化情况。闪回版本查询基于回滚(Undo)表空间中的回滚信息实现。
查询语句一般为:
代码语言:javascript复制SELECT TO_CHAR(VERSIONS_STARTTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_STARTTIME,VERSIONS_STARTSCN,TO_CHAR(VERSIONS_ENDTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_ENDTIME ,VERSIONS_ENDSCN,VERSIONS_XID,VERSIONS_OPERATION,EMPNO
FROM T_FVQ_20170617_LHR VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
ORDER BY VERSIONS_STARTTIME;
其中,VERSIONS BETWEEN用于指定闪回版本查询时查询的时间段或SCN段;AS OF用于指定闪回查询时查询的时间点或SCN。在闪回版本查询的目标列中,可以使用下列几个伪列返回版本信息:
l VERSIONS_STARTTIME:基于时间的版本有效范围的下界;
l VERSIONS_STARTSCN:基于SCN的版本有效范围的下界;
l VERSIONS_ENDTIME:基于时间的版本有效范围的上界;
l VERSIONS_ENDSCN:基于SCN的版本有效范围的上界;
l VERSIONS_XID:操作的事务ID,唯一的标识行;
l VERSIONS_OPERATION:执行操作的类型,I 表示INSERT,D 表示DELETE,U 表示UPDATE。
闪回版本查询注意事项:
① VERSIONS子句不能用于查询的表包括外部表、临时表和固定表。
② 不能使用VERSIONS子句查询视图。但是,在视图定义中可使用VERSIONS子句。
③ SELECT语句中的VERSIONS子句不能跨多个DDL语句(这些语句会更改相应表的结构)。
闪回版本查询示例:
代码语言:javascript复制LHR@orclasm > SHOW PARAMETER UNDO
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_undo_autotune boolean FALSE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
LHR@orclasm > CREATE TABLE T_FVQ_20170617_LHR AS SELECT * FROM SCOTT.EMP WHERE 1=2;--创建表T_FVQ_20170617_LHR
Table created.
LHR@orclasm > SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询时间作为TIMESTAMP开始时间
TO_DATE(SYSDATE,'YY TIMESTAMP_TO_SCN(SYSDATE)
------------------- -------------------------
2017-06-17 14:49:58 67842991
LHR@orclasm > INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7902;--插入EMPNO=7902
1 row created.
LHR@orclasm > COMMIT; --插入一行提交作为一个版本
Commit complete.
LHR@orclasm > INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7788;
1 row created.
LHR@orclasm > INSERT INTO T_FVQ_20170617_LHR SELECT * FROM SCOTT.EMP WHERE EMPNO=7698;
1 row created.
LHR@orclasm > COMMIT; --插入两行提交作为一个版本
Commit complete.
LHR@orclasm > UPDATE T_FVQ_20170617_LHR SET SAL=8888 WHERE EMPNO=7788;
1 row updated.
LHR@orclasm > COMMIT; --再次更改EMPNO=7788的行提交,使这行有旧版本
Commit complete.
LHR@orclasm > SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询时间作为TIMESTAMP结束时间
TO_DATE(SYSDATE,'YY TIMESTAMP_TO_SCN(SYSDATE)
------------------- -------------------------
2017-06-17 14:51:46 67843218
LHR@orclasm > SELECT TO_CHAR(VERSIONS_STARTTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_STARTTIME,VERSIONS_STARTSCN,TO_CHAR(VERSIONS_ENDTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_ENDTIME ,VERSIONS_ENDSCN,VERSIONS_XID,VERSIONS_OPERATION,EMPNO
2 FROM T_FVQ_20170617_LHR VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
3 ORDER BY VERSIONS_STARTTIME;
VERSIONS_STARTTIME VERSIONS_STARTSCN VERSIONS_ENDTIME VERSIONS_ENDSCN VERSIONS_XID V EMPNO
------------------- ----------------- ------------------- --------------- ---------------- - ----------
2017-06-17 14:50:04 67843038 050007009F9F0000 I 7902
2017-06-17 14:50:57 67843139 07000D0018830000 I 7698
2017-06-17 14:50:57 67843139 2017-06-17 14:51:34 67843209 07000D0018830000 I 7788
2017-06-17 14:51:34 67843209 07001F0019830000 U 7788
本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗