2013年(350)
分类: Oracle
2013-04-25 11:09:15
3、Versions between版本查询
功能更加强大,通过versions between能够查看指定时间段内undo表空间中记录的不同版本(注意,只包括被提交的记录)。
版本查询的用法并不比as of复杂,与其类似,你只需要在标准查询后面附加versions between timestamp[/scn] t1 and t2即可。记录在版本查询中可能会是一对多的关系,比如某些记录如果被修改过多次,并分别提交,那么你在查询的时候,如果修改的操作是在你指定的时间段(或scn),则记录每次修改的结果都会被选择出来,这比较有利于我们做数据的对比,比如看看数据究竟是怎么变化的。
版本查询过程中提供了多个伪列如下:
VERSIONS_STARTSCN |
该记录操作时的scn或时间,如果为空,表示该行记录是在查询范围外创建的。 |
VERSIONS_ENDSCN VERSIONS_ENDTIME |
该记录失效时的scn或时间,如果为空,说明记录当前时间在当前表内存在,或者已经被删除了,可以配合着VERSIONS_OPERATION列来看,如果VERSIONS_OPERATION列值为D,说明该列已被删除,如果该列为空,则说明记录在这段时间无操作。 |
VERSIONS_XID |
该操作的事务ID |
VERSIONS_OPERATION |
对该行执行的操作:I表示insert,D表示delete,U表示update。 提示:对于索引键的update操作,版本查询可能会将其识别成两个操作:DELETE和INSERT。 |
举个例子(仍用前面创建的测试表):
--先来查询一下当前的scn,方面我们后面确认选择的范围
JSSWEB> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
372466
JSSWEB> update jss_tb1 set id=id+100 where id>15;
已更新5行。
JSSWEB> commit;
提交完成。
JSSWEB> delete jss_tb1 where id<5;
已删除4行。
JSSWEB> commit;
提交完成。
JSSWEB> insert into jss_tb1 values (201,'A1');
已创建 1 行。
JSSWEB> insert into jss_tb1 values (202,'B1');
已创建 1 行。
JSSWEB> commit;
提交完成。
--再来查询一下当前的scn,方面我们后面确认选择的范围
JSSWEB> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
372538
通过versions between,我们就可以看到表jss_tb1中的记录的变化情况:
JSSWEB> select id,vl,versions_startscn,versions_endscn,versions_operation
2 from jss_tb1 versions between scn 372466 and 372538 order by 2;
ID VL VERSIONS_STARTSCN VERSIONS_ENDSCN V
---------- -------------------- ----------------- --------------- -
1 A 372512 D
1 A 372512
201 A1 372523 I
2 B 372512 D
2 B 372512
202 B1 372523 I
3 C 372512 D
3 C 372512
4 D 372512
4 D 372512 D
5 E
6 F
7 G
8 H
9 I
10 J
11 K
12 L
13 M
14 N
15 O
116 P 372466 U
117 Q 372466 U
118 R 372466 U
119 S 372466 U
120 T 372466 U
已选择26行。
根据这个结果返回我们首先来看id<5的记录,每个记录各有两个版本,一行的VERSIONS_STARTSCN和VERSIONS_OPERATION有值,记录了开始时的SCN和执行的操作,另一行则是VERSIONS_ENDSCN有值,记录了该版本失效时的scn。
Id>200的有两条记录,是我们自己手工添加中,从VERSIONS_OPERATION列可以看出操作是insert。
另有5行id>100 and id<200的,从VERSIONS_OPERATION列可以看出操作是update,这是我们手工执行update set的结果。
===================================