使用ORA_ROWSCN值更新oracle 10g中的列

时间:2015-10-02 13:05:44

标签: sql oracle oracle10g

我正在尝试在表格中填写新列。

我需要这个新列的值是行的创建日期。 对于表的先前值,我最好的efford是使用ORA_ROWSCN。

我在查询中选择此值,但更新失败:

UPDATE mytable AA 
  SET AA.reg_date = SCN_TO_TIMESTAMP(AA .ORA_ROWSCN);

其他选项也失败了:

UPDATE mytable AA 
  SET AA.reg_date = SCN_TO_TIMESTAMP
  (
  SELECT bb.ORA_ROWSCN   
  FROM mytable bb
  WHERE bb.ID= AA.ID
  );

任何选择?提前谢谢

3 个答案:

答案 0 :(得分:1)

ORA_ROWSCN默认是整个块的最后一次更新,因此块中的所有行都将具有相同的值(在最后一个DML期间分配的行)。该表需要使用ROWDEPENDENCIES创建,以存储每行的SCN(需要额外的空间)。

此外,SCN_TO_TIMESTAMP函数的范围受限于它可以转换为时间戳的SCN。此映射仅存储一段时间,这与您遇到的错误最相似。

答案 1 :(得分:0)

为什么要使用ORA_ROWSCN

您只需创建一个原生timestamp类型的列,其默认值将自动应用于新行(如果您不覆盖它)。

alter table <table name> add column <column name> timestamp default systimestamp;

此解决方案更接近您的目标。

答案 2 :(得分:0)

我担心检索创建日期的唯一可靠方法是确保在创建行时保留该信息。

使用scn_to_timestampora_rowscn检索创建时间戳无法正常工作:

  • 如果有效,它只会根据SCN为您提供大致的时间戳。不是确切的时间。
  • 更新行时ora_rowscn会发生更改。因此,在某些情况下,您将获得更新时间戳,而不是创建时间戳。
  • 当知道同一数据块中的其他数据时,ora_rowscn也会发生变化。因此,该值可能完全错误,与您的行无关。
  • 而且,更糟糕的是,如果scn太旧,scn_to_timestamp根本无法工作。记录在案here
  

生成SCN时SCN与时间戳之间的关联由数据库 在一段有限的时间内记住