使用 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_timestamp
和 ora_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.
我正尝试在 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_timestamp
和 ora_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.