4

我正在使用 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列进行必要的比较?

4

1 回答 1

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 列,或者可能启用行级依赖项跟踪。这仍然不准确:

... 表中的每一行都有一个系统更改号 (SCN),表示大于或等于修改该行的最后一个事务的提交时间的时间

于 2013-07-23T11:51:52.540 回答