这是一个非常重要的特性。从oracle10g开始,oracle在表上引入了一个伪列ORA_ROWSCN。该列记录了每一列最后更改的SCN。但是有两种模式,一种是默认的是data block级别,另一种是row级别,需要在建立表的时候指定ROWDEPENDENCIES,而且不能在表创建后用alter table语句去更改。

我们知道默认情况下SCN存储在data block的头部。这里记载的是该data block的最新更改的SCN。所以默认情况下,你去查一个表的ORA_ROWSCN,同数据块的值是相同的。如下:

SQL> create table test (id number,val char(2000));
SQL> insert into test(id , val) select rownum,object_name from dba_objects where rownum<20;
SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test; ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
1 60754 618028 08-AUG-14 03.40.58.000000000 PM
2 60754 618028 08-AUG-14 03.40.58.000000000 PM
3 60754 618028 08-AUG-14 03.40.58.000000000 PM
4 60755 618028 08-AUG-14 03.40.58.000000000 PM
5 60755 618028 08-AUG-14 03.40.58.000000000 PM
6 60755 618028 08-AUG-14 03.40.58.000000000 PM
7 60756 618028 08-AUG-14 03.40.58.000000000 PM
8 60756 618028 08-AUG-14 03.40.58.000000000 PM
9 60756 618028 08-AUG-14 03.40.58.000000000 PM
10 60757 618028 08-AUG-14 03.40.58.000000000 PM
11 60757 618028 08-AUG-14 03.40.58.000000000 PM
12 60757 618028 08-AUG-14 03.40.58.000000000 PM
13 60758 618028 08-AUG-14 03.40.58.000000000 PM
14 60758 618028 08-AUG-14 03.40.58.000000000 PM
15 60758 618028 08-AUG-14 03.40.58.000000000 PM
16 60759 618028 08-AUG-14 03.40.58.000000000 PM
17 60759 618028 08-AUG-14 03.40.58.000000000 PM
18 60759 618028 08-AUG-14 03.40.58.000000000 PM
19 60760 618028 08-AUG-14 03.40.58.000000000 PM

上面是准备工作,创建一个表,该表有多个数据块,接下来我们把id=18这一列update看一下结果。

SQL> update test set id=118 where id=18;

1 row updated.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
1 60754 618028 08-AUG-14 03.40.58.000000000 PM
2 60754 618028 08-AUG-14 03.40.58.000000000 PM
3 60754 618028 08-AUG-14 03.40.58.000000000 PM
4 60755 618028 08-AUG-14 03.40.58.000000000 PM
5 60755 618028 08-AUG-14 03.40.58.000000000 PM
6 60755 618028 08-AUG-14 03.40.58.000000000 PM
7 60756 618028 08-AUG-14 03.40.58.000000000 PM
8 60756 618028 08-AUG-14 03.40.58.000000000 PM
9 60756 618028 08-AUG-14 03.40.58.000000000 PM
10 60757 618028 08-AUG-14 03.40.58.000000000 PM
11 60757 618028 08-AUG-14 03.40.58.000000000 PM
12 60757 618028 08-AUG-14 03.40.58.000000000 PM
13 60758 618028 08-AUG-14 03.40.58.000000000 PM
14 60758 618028 08-AUG-14 03.40.58.000000000 PM
15 60758 618028 08-AUG-14 03.40.58.000000000 PM
16 60759 618028 08-AUG-14 03.40.58.000000000 PM
17 60759 618028 08-AUG-14 03.40.58.000000000 PM
118 60759 618028 08-AUG-14 03.40.58.000000000 PM
19 60760 618028 08-AUG-14 03.40.58.000000000 PM 19 rows selected.

现在还没有commit。但是按照猜想这60759这个数据块对应的列的SCN都应该变了。不过实际没有变,不知道为什么,需要再研究,不过我们commit一下就会变了。

SQL> commit;

Commit complete.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
1 60754 618028 08-AUG-14 03.40.58.000000000 PM
2 60754 618028 08-AUG-14 03.40.58.000000000 PM
3 60754 618028 08-AUG-14 03.40.58.000000000 PM
4 60755 618028 08-AUG-14 03.40.58.000000000 PM
5 60755 618028 08-AUG-14 03.40.58.000000000 PM
6 60755 618028 08-AUG-14 03.40.58.000000000 PM
7 60756 618028 08-AUG-14 03.40.58.000000000 PM
8 60756 618028 08-AUG-14 03.40.58.000000000 PM
9 60756 618028 08-AUG-14 03.40.58.000000000 PM
10 60757 618028 08-AUG-14 03.40.58.000000000 PM
11 60757 618028 08-AUG-14 03.40.58.000000000 PM
12 60757 618028 08-AUG-14 03.40.58.000000000 PM
13 60758 618028 08-AUG-14 03.40.58.000000000 PM
14 60758 618028 08-AUG-14 03.40.58.000000000 PM
15 60758 618028 08-AUG-14 03.40.58.000000000 PM
16 60759 618251 08-AUG-14 03.45.28.000000000 PM
17 60759 618251 08-AUG-14 03.45.28.000000000 PM
118 60759 618251 08-AUG-14 03.45.28.000000000 PM
19 60760 618028 08-AUG-14 03.40.58.000000000 PM

我们再看一下row级别的。

SQL> create table test (id number,val char(2000)) rowdependencies  ;

Table created.

SQL> insert into test(id , val) select rownum,object_name from dba_objects where rownum<20;

19 rows created.

SQL> commit;

Commit complete.

SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test;

        ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
1 60754 618618 08-AUG-14 03.57.40.000000000 PM
2 60754 618618 08-AUG-14 03.57.40.000000000 PM
3 60754 618618 08-AUG-14 03.57.40.000000000 PM
4 60755 618618 08-AUG-14 03.57.40.000000000 PM
5 60755 618618 08-AUG-14 03.57.40.000000000 PM
6 60755 618618 08-AUG-14 03.57.40.000000000 PM
7 60756 618618 08-AUG-14 03.57.40.000000000 PM
8 60756 618618 08-AUG-14 03.57.40.000000000 PM
9 60756 618618 08-AUG-14 03.57.40.000000000 PM
10 60757 618618 08-AUG-14 03.57.40.000000000 PM
11 60757 618618 08-AUG-14 03.57.40.000000000 PM
12 60757 618618 08-AUG-14 03.57.40.000000000 PM
13 60758 618618 08-AUG-14 03.57.40.000000000 PM
14 60758 618618 08-AUG-14 03.57.40.000000000 PM
15 60758 618618 08-AUG-14 03.57.40.000000000 PM
16 60759 618618 08-AUG-14 03.57.40.000000000 PM
17 60759 618618 08-AUG-14 03.57.40.000000000 PM
18 60759 618618 08-AUG-14 03.57.40.000000000 PM
19 60760 618618 08-AUG-14 03.57.40.000000000 PM 19 rows selected. SQL> update test set id=888 where id=18; 1 row updated. SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test; ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
1 60754 618618 08-AUG-14 03.57.40.000000000 PM
2 60754 618618 08-AUG-14 03.57.40.000000000 PM
3 60754 618618 08-AUG-14 03.57.40.000000000 PM
4 60755 618618 08-AUG-14 03.57.40.000000000 PM
5 60755 618618 08-AUG-14 03.57.40.000000000 PM
6 60755 618618 08-AUG-14 03.57.40.000000000 PM
7 60756 618618 08-AUG-14 03.57.40.000000000 PM
8 60756 618618 08-AUG-14 03.57.40.000000000 PM
9 60756 618618 08-AUG-14 03.57.40.000000000 PM
10 60757 618618 08-AUG-14 03.57.40.000000000 PM
11 60757 618618 08-AUG-14 03.57.40.000000000 PM
12 60757 618618 08-AUG-14 03.57.40.000000000 PM
13 60758 618618 08-AUG-14 03.57.40.000000000 PM
14 60758 618618 08-AUG-14 03.57.40.000000000 PM
15 60758 618618 08-AUG-14 03.57.40.000000000 PM
ERROR:
ORA-01405: fetched column value is NULL 15 rows selected. SQL> commit; Commit complete. SQL> select id , dbms_rowid.rowid_block_number(ROWID),ora_rowscn,scn_to_timestamp(ora_rowscn) from test; ID DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) ORA_ROWSCN SCN_TO_TIMESTAMP(ORA_ROWSCN)
---------- ------------------------------------ ---------- ---------------------------------------------------------------------------
1 60754 618618 08-AUG-14 03.57.40.000000000 PM
2 60754 618618 08-AUG-14 03.57.40.000000000 PM
3 60754 618618 08-AUG-14 03.57.40.000000000 PM
4 60755 618618 08-AUG-14 03.57.40.000000000 PM
5 60755 618618 08-AUG-14 03.57.40.000000000 PM
6 60755 618618 08-AUG-14 03.57.40.000000000 PM
7 60756 618618 08-AUG-14 03.57.40.000000000 PM
8 60756 618618 08-AUG-14 03.57.40.000000000 PM
9 60756 618618 08-AUG-14 03.57.40.000000000 PM
10 60757 618618 08-AUG-14 03.57.40.000000000 PM
11 60757 618618 08-AUG-14 03.57.40.000000000 PM
12 60757 618618 08-AUG-14 03.57.40.000000000 PM
13 60758 618618 08-AUG-14 03.57.40.000000000 PM
14 60758 618618 08-AUG-14 03.57.40.000000000 PM
15 60758 618618 08-AUG-14 03.57.40.000000000 PM
16 60759 618618 08-AUG-14 03.57.40.000000000 PM
17 60759 618618 08-AUG-14 03.57.40.000000000 PM
888 60759 618643 08-AUG-14 03.58.28.000000000 PM
19 60760 618618 08-AUG-14 03.57.40.000000000 PM 19 rows selected.

先创建一个表,指定rowdependencies 然后插入数值。

我们先更新了一列,没commit,然后去select。有意思的是这里出了个错误,很值得研究。

然后我们commit后发现这一列的更改时间知道了。

ORA_ROWSCN的更多相关文章

  1. oracle ORA_ROWSCN 行记录的更新时间

    在这介绍两个oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block,这是默认的模式,还有一种是基于row上,这种模式只能在建里表时指定ROWDEPENDENC ...

  2. oracle行跟踪(基于行跟踪的ROWDEPENDENCIES ORA_ROWSCN信息)

    在Oracle 10g中的引入了ORA_ROWSCN伪列新特性.基于此种伪列所提供的信息,我们可以方便地找出某个数据块或某一个行最近被修改的时间戳.在默认情况下,10g下表会以非行依赖性(NOROWD ...

  3. Oracle 中的伪列

    昨天做了一个Oracle PL/SQL 相关的测试,其中有一道这样的题目:   下列那些是Oracle的伪列(ACD)  A.ROWID   B.ROW_NUMBER()  C.LEVEL  D.RO ...

  4. oracle 关键字

    Oracle 关键字(保留字) DBA账户下执行SQL语句:select * from v$reserved_words ;  可得到所有的关键字:   1 ! 1 2 & 1 3 ( 1 4 ...

  5. 如何查看oracle数据库的所有的关键字

    管理员账户登录后,执行以下命令:  select * from v$reserved_words 附上参考: NOMONITORINGRECORDS_PER_BLOCKCASCADEDYNAMIC_S ...

  6. ORACLE恢复数据

    ORACLE恢复删除表或表记录 一:表的恢复      对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: 1.从flash back里查询 ...

  7. 【锁】Oracle锁系列

    [锁]Oracle锁系列 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ...

  8. Oracle的悲观锁和乐观锁---摘抄

    1.无论是选择悲观锁策略,还是乐观锁策略.如果一个对象被上了锁,那么该对象都会受这个锁的控制和影响.如果这个锁是个排它锁,那么其它会话都不能修改它. 2.选择悲观锁策略,还是乐观锁策略,这主要是由应用 ...

  9. oracle触发器如何使用2

    触发器 是特定事件出现的时候,自动执行的代码块.类似于存储过程,但是用户不能直接调用他们.触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处 ...

随机推荐

  1. jquery 菜单展开与收缩参考脚本

    /* * metismenu - v1.1.3 * Easy menu jQuery plugin for Twitter Bootstrap 3 * https://github.com/onoku ...

  2. C# 输出控制台结果到文件

    StreamWriter sw = new StreamWriter(@"c:\output.txt"); Console.SetOut(sw); Console.WriteLin ...

  3. 安卓TV盒子常见问题以及解决方法

    1.为什么requestfocus无效 原因:requestfocus不支持在Touch模式下的Focus; 解法方案:再加一个requestFocusFromTouch函数. 2.摄像头打开问题,调 ...

  4. python学习笔记(6)——字典(Dictionary)

    dict= {key1 : value1, key2 : value2 ...} 关键词:字典中元素成对出现- key:value 格式- 两端{ } ,键:值,每对键值间用 ,隔开. 键key-唯一 ...

  5. HDU_6017_Girls love 233_(dp)(记忆化搜索)

    Girls Love 233  Accepts: 30  Submissions: 218  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  6. Vue指令的概念

    指令(Directives) 是带有v- 前缀的特殊属性,指令属性是单一的js表达式. 指令的职责就是表达式的值发生变化时,在DOM中做出相应的回应. 如下例子: 实例 <div id=&quo ...

  7. (独孤九剑)--MySQL入门

    :[一]概论 (1)什么是 MySQL? 一种关系型开源数据库,定义了存储信息的结构. 在数据库中,存在着一些表.类似 HTML 表格,数据库表含有行.列以及单元. 在分类存储信息时,数据库非常有用. ...

  8. 05Oracle Database 表空间查看,创建,修改及删除

    Oracle Database 表空间查看,创建,修改及删除 查看用户表空间 查看数据库管理员表空间表结构 desc dba_tablespaces; 查询表空间名称从管理员表空间表中 select ...

  9. Python学会之后,一般能拿到多少工资?

    Python在约40年前出现以来,已经有数以千计基于这项技术的网站和软件项目,Python因其独有的特点从众多开发语言中脱颖而出,深受世界各地的开发者喜爱. 随着Python的技术的流行,Python ...

  10. Docker 的基本使用

    一.简介 Docker 是一个开源的应用容器引擎,基于 Go 语言.Docker 支持将软件编译成一个镜像,然后在镜像中为软件做好配置,将镜像发布出去,其他使用者就可以直接使用这个镜像,而不需再和以前 ...