加载中…
个人资料
SniperWD
SniperWD
  • 博客等级:
  • 博客积分:0
  • 博客访问:35,754
  • 关注人气:23
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

ora_rowscn函数

(2009-10-10 16:41:00)
标签:

杂谈

分类: SQL & DBMS

ORA_ROWSCN Pseudocolumn

For each row, ORA_ROWSCN returns the conservative upper bound system change number (SCN) of the most recent change to the row. This pseudocolumn is useful for determining approximately when a row was last updated. It is not absolutely precise, because Oracle tracks SCNs by transaction committed for the block in which the row resides. You can obtain a more fine-grained approximation of the SCN by creating your tables with row-level dependency tracking.

You cannot use this pseudocolumn in a query to a view. However, you can use it to refer to the underlying table when creating a view. You can also use this pseudocolumn in the WHERE clause of an UPDATE or DELETE statement.

ORA_ROWSCN is not supported for Flashback Query. Instead, use the version query pseudocolumns, which are provided explicitly for Flashback Query.

Restriction: This pseudocolumn is not supported for external tables.

 

先创建一个测试表dept_1,看看rowscn是怎样变化的:

scott@ORA10G> create table dept_2
  as select * from dept;

表已创建。

看一下各行的blockno和rowscn:

scott@ORA10G> select deptno, dname, loc,
  dbms_rowid.rowid_block_number(rowid) blockno, ora_rowscn
  from dept_1;

  DEPTNO DNAME          LOC          BLOCKNO ORA_ROWSCN
---------- -------------- ------------- ---------- ----------
        10 ACCOUNTING  NEW YORK     476     762415
        20 RESEARCH      DALLAS         476     762415
        30 SALES           CHICAGO       476     762415
        40 OPERATIONS  BOSTON        476     762415

blockno都相同说明这4行数据都存储在同一个oracle数据块中,现在更新其中的一行:

scott@ORA10G> update dept_1
  set dname=lower(dname)
  where deptno=10;

已更新 1 行。

scott@ORA10G> commit;

提交完成。

再观察一下rowscn列,会发现同一个块上的所有列(即blockno相同的列)的rowscn都发生了变化:

scott@ORA10G> select deptno,dname,loc,
  dbms_rowid.rowid_block_number(rowid) blockno,ora_rowscn
  from dept_1;

  DEPTNO DNAME          LOC          BLOCKNO ORA_ROWSCN
---------- -------------- ------------- ---------- ----------
        10 accounting     NEW YORK     476     762516
        20 RESEARCH      DALLAS          476     762516
        30 SALES           CHICAGO        476     762516
        40 OPERATIONS  BOSTON         476     762516

这是由于默认情况下,每行记录的rowscn是基于block的,除非在建表的时候执行开启行级跟踪。
因此再创建一个带rowdependencies选项的表dept_2,重复上述操作,会看到只有真正被更新的那一列的rowscn发生了变化:

scott@ORA10G> create table dept_2
  rowdependencies
  as select * from dept;

表已创建。

scott@ORA10G> select deptno,dname,loc,
  dbms_rowid.rowid_block_number(rowid) blockno,ora_rowscn
  from dept_2;

  DEPTNO DNAME          LOC          BLOCKNO ORA_ROWSCN
---------- -------------- ------------- ---------- ----------
        10 ACCOUNTING   NEW YORK     484     762644
        20 RESEARCH       DALLAS         484     762644
        30 SALES            CHICAGO       484     762644
        40 OPERATIONS   BOSTON        484     762644

scott@ORA10G> update dept_2
  set dname=lower(dname)
  where deptno=10;

已更新 1 行。

scott@ORA10G> commit;

提交完成。

scott@ORA10G> select deptno,dname,loc,
  dbms_rowid.rowid_block_number(rowid) blockno,ora_rowscn
  from dept_2;

  DEPTNO DNAME          LOC          BLOCKNO ORA_ROWSCN
---------- -------------- ------------- ---------- ----------
        10 accounting     NEW YORK     484     762682
        20 RESEARCH      DALLAS          484     762644
        30 SALES           CHICAGO        484     762644
        40 OPERATIONS  BOSTON         484     762644

哈哈,有了rowscn伪列,就可以在某些需要select … for update做悲观锁定的时候,通过使用ora_rowscn改为乐观锁定。

 

BTW:还可以将ora_rowscn转换为近似的时间,从而知道最后的一次修改在什么时间:

scott@ORA10G> select deptno,ora_rowscn,scn_to_timestamp(ora_rowscn) ts
  from dept_2;

  DEPTNO ORA_ROWSCN  TS
---------- --------------- ------------------------------------------------
        10     762682      10-10月-09 04.12.28.000000000 下午
        20     762644      10-10月-09 04.11.13.000000000 下午
        30     762644      10-10月-09 04.11.13.000000000 下午
        40     762644      10-10月-09 04.11.13.000000000 下午

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有