http://database.51cto.com/art/200701/37935.htm
用Oracle 10g新的行时间戳捕捉变化
数据仓库经常通过多种数据源系统填充,而每种系统都运行有自己的应用程序。在Oracle 10g中,在行最后一次被更新的时候,每一行都有一个新的被称作ORA_ROWSCN的伪列。本文介绍如何用Oracle 10g新的行时间戳捕捉变化。
数据仓库经常通过多种数据源系统填充,而每种系统都运行有自己的应用程序。所以为了能给数据仓库只提供新数据,确定哪些是最近更新的行是一件非常复杂的事。在处理一些其架构中不包括“上次更新时间”列的过时软件时,这尤其是一个难题。企业自然不情愿仅仅为了追踪变化而通过修改工作代码来添加列。
在Oracle 10g中,在行最后一次被更新的时候,每一行都有一个新的被称作ORA_ROWSCN的伪列。 ORA_ROWSCN 提供了一个“保守上边界(conservative upper bound)”系统改变数,用来记录最近被修改的行的事务。这就意味着系统改变数(SCN)是一个估计值,因为在Oracle中系统改变数只能默认在模块级被追踪。
例如在列表A中,ORA_ROWSCN 在处理一个小表格时被选中,一行被更新后,ORA_ROWSCN 再次被选中。
列表A
SQL> |
即使只有一行被改动了,剩下的也会显示一个新的系统改变数(SCN)。(更准确地说,你可以在一个表第一次被创建时,使用行级系统改变数追踪。但遗憾的是,你不能够更改该表格,以便在以后加入该特性。)所以如果被更新的块数比表中的块数要少,这也可以成为一种发现变化的方法,而不用涉及太多额外的行。
如果你需要与事务有关的日期和时间应该怎么办呢?SCN_TO_TIMESTAMP函数可以将ORA_ROWSCN 转换成为一个时间戳,利用它你可以进行查询,或者把它用作一个WHERE 子句的谓语。但是,这个时间戳仍然是一个估计值。
ORA_ROWSCN 也是将系统改变值(SCN)用作闪回查询捷径(尽管RA_ROWSCN 本身在闪回中并不能被选中)的一种很方便的方法,不然就要用闪回形式查询,选中VERSIONS_STARTSCN 和VERSIONS_ENDSCN 伪列。
列表B是一次闪回查询,它用一个小于当前值的系统改变值来获得一个数据行原来的值。我们发现King的工资回到了5000,而ORA_ROWSCN的值则是最初的系统改变值。
列表B
SQL> SELECT ora_rowscn, ename, sal
2 FROMemp AS OF SCN (653330)
3 WHERE ename = 'KING';
ORA_ROWSCN ENAME SAL
---------- ---------- ----------
529426 KING 5000
转载于:https://blog.51cto.com/guerrilla/1343319