今天看到一个新函数ora_rowscn(其实这个函数也不新了,从oracle10g R1 就有了,只是我不知道,嘿嘿。。。),顺道在这里记录下。
下例所示,在查询语句里直接调用ora_rowscn,就就能显示出每行最后一次的SCN,
Example1:
bu5705@ADW1U>select a.*,dbms_rowid.rowid_block_number(rowid),to_char(ora_rowscn) from test1 a;
---------- ---------- ------------------------------------ ----------------------------------------
在上面的例子中,我分两批插入的数据,我们可以看到这两批数据的 scn好是不一样的。
在这里要特别注意的在默认状态下,oracle是在块级维护scn的。
Example2:
bu5705@ADW1U>update test1 set serial#=12345 where sid=4574;
1 row updated.
bu5705@ADW1U>commit;
Commit complete.
bu5705@ADW1U>select a.*,dbms_rowid.rowid_block_number(rowid),to_char(ora_rowscn) from test1 a;
---------- ---------- ------------------------------------ ----------------------------------------
在Example2里我们可以清楚的看到我们只修改了sid=4574那一行的值,但是所有在block#为20552上所有数据的scn都因此而改变了。
假若想从行级跟踪SCN,就必须在create table
不能用简单的alter table语句来实现,必须重建table。
Example3:
bu5705@ADW1U>drop table test1;
Table dropped.
bu5705@ADW1U>create table test1 rowdependencies as select sid,serial# from v$session where rownum<5;
Table created.
bu5705@ADW1U>select a.*,dbms_rowid.rowid_block_number(rowid),to_char(ora_rowscn) from test1 a;
---------- ---------- ------------------------------------ ----------------------------------------
bu5705@ADW1U>update test1 set serial#=12345 where sid=4534;
1 row updated.
bu5705@ADW1U>commit;
Commit complete.
bu5705@ADW1U>select a.*,dbms_rowid.rowid_block_number(rowid),to_char(ora_rowscn) from test1 a;
---------- ---------- ------------------------------------ ----------------------------------------
bu5705@ADW1U>select a.*, scn_to_timestamp(ora_rowscn) from test1 a;
---------- ---------- ---------------------------------------------------------------------------