我正在使用Oracle 10g XE。我有一个数据库查询 -
SELECT PID FROM PROUCT WHERE last_modified > '${dih.last_index_time}'
我在这里要做的是比较时间戳。问题是我的表没有last_modified
列,我也无法将其添加到表中。但是有一个查询 -
SELECT SCN_TO_TIMESTAMP( ORA_ROWSCN ) FROM PRODUCT;
这将返回一个包含所需时间戳的列。
如何使用此查询代替last-modified
列进行必要的比较?
答案 0 :(得分:2)
您只需将其放在WHERE子句中:
SELECT PID
FROM PRODUCT
WHERE SCN_TO_TIMESTAMP( ORA_ROWSCN ) > '${dih.last_index_time}'
但,您的两个查询不相同。从ORA_ROWSCN文档(我的重点):
对于每一行,ORA_ROWSCN将最近更改的保守上限系统更改编号(SCN)返回到当前会话中的行。当最后一次更新行时,此伪列对于确定近似非常有用。 这不是绝对精确,因为Oracle通过为行所在的块提交的事务来跟踪SCN。
这意味着如果修改块中的一行,则整个块(多行)将具有相同的SCN。
如果您希望查询准确无误,则需要添加LAST_MODIFIED列,或者可能启用row-level dependency tracking。这仍然不准确:
...表中的每一行都有一个系统更改号(SCN),表示大于或等于修改行的最后一个事务的提交时间