我需要根据上次修改表的时间从表中获取数据。 负载大约需要10分钟,所以我希望得到max(ora_rowscn)减去10分钟。
select TO_CHAR(SCN_TO_TIMESTAMP(max(ORA_ROWSCN) - 600 ),'YYYY-MM-DD HH24:MI:SS')
FROM table
...
答案 0 :(得分:1)
您可以使用SCN_TO_TIMESTAMP
和TIMESTAMP_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);
...或者您要指定的任何时间戳。 在表上设置一个时间戳列,由加载过程设置或自动使用触发器,因为它不依赖于重做保留,因此可能更加可靠,但在加载过程中可能会稍慢一些。如果这是一次性检查,那么闪回查询将是最简单的。