我正在尝试在表格中填写新列。
我需要这个新列的值是行的创建日期。 对于表的先前值,我最好的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
);
任何选择?提前谢谢
答案 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_timestamp
和ora_rowscn
检索创建时间戳无法正常工作:
SCN
为您提供大致的时间戳。不是确切的时间。ora_rowscn
会发生更改。因此,在某些情况下,您将获得更新时间戳,而不是创建时间戳。ora_rowscn
也会发生变化。因此,该值可能完全错误,与您的行无关。scn
太旧,scn_to_timestamp
根本无法工作。记录在案here。生成SCN时SCN与时间戳之间的关联由数据库 在一段有限的时间内记住 。