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

use ORA_ROWSCN value for update a column in oracle 10g

我正尝试在 table 中完成一个新专栏。

我需要这个新列的值是该行的创建日期。 我对 table 先前值的最大努力是使用 ORA_ROWSCN.

我在查询中达到 select 这个值,但更新失败:

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
  );

有什么选择吗?提前致谢

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

此外,SCN_TO_TIMESTAMP 函数在可以转换为时间戳的 SCN 范围内受到限制。此映射仅存储一定时间,最像您遇到的错误。

你为什么要使用 ORA_ROWSCN

您可以简单地创建一个具有默认值的本机 timestamp 类型的列,该默认值将自动应用于新行(如果您不覆盖它)。

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

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

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

无法使用 scn_to_timestampora_rowscn 检索创建时间戳,原因如下:

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

The association between an SCN and a timestamp when the SCN is generated is remembered by the database for a limited period of time.