获得最大值(ora_rowscn) - 10分钟

时间:2014-05-21 12:58:35

标签: oracle

我需要根据上次修改表的时间从表中获取数据。 负载大约需要10分钟,所以我希望得到max(ora_rowscn)减去10分钟。

select TO_CHAR(SCN_TO_TIMESTAMP(max(ORA_ROWSCN) - 600 ),'YYYY-MM-DD HH24:MI:SS')
FROM table

...

1 个答案:

答案 0 :(得分:1)

您可以使用SCN_TO_TIMESTAMPTIMESTAMP_TO_SCN与时间戳进行转换:

select max(ora_rowscn),
  timestamp_to_scn(scn_to_timestamp(max(ora_rowscn))
    - interval '10' minute) as adj
from <your table>;

  MAX(ORA_ROWSCN)               ADJ
----------------- -----------------
   10320929886378    10320929885515

在某些情况下,您可能无法将SCN转换为时间戳,如果它太旧而无法查找;然后你会得到ORA-08181: specified number is not a valid system change number之类的东西。请注意SCN_TO_TIMESTAMP文档中有关SCN与时间戳关联的信息。

您可以绕过max查找并使用:

select timestamp_to_scn(systimestamp - interval '10' minute) from dual

...或使用加载过程的结束时间。但是,您可能仍然没有这种关联,具体取决于时间段和重做保留时间。

无论如何,

A flashback query可能更简单,再次假设您在重做保留期内执行此操作:

select * from <your table>
as of timestamp (systimestamp - interval '10' minute);

...或者您要指定的任何时间戳。 在表上设置一个时间戳列,由加载过程设置或自动使用触发器,因为它不依赖于重做保留,因此可能更加可靠,但在加载过程中可能会稍慢一些。如果这是一次性检查,那么闪回查询将是最简单的。