【问题标题】:Query on last modified time without a last modified column在没有最后修改列的情况下查询最后修改时间
【发布时间】:2013-07-22 11:12:42
【问题描述】:

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

【问题讨论】:

    标签: sql database oracle oracle10g


    【解决方案1】:

    您只需将其放在 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),表示大于或等于修改该行的最后一个事务的提交时间

    【讨论】:

    • 查询无效。我收到一个错误 - “无法执行查询”
    • 它适用于我@Archit:sqlfiddle.com/#!4/f047f/1。你能说得更具体点吗?
    • 啊啊……对不起。我的错!我现在收到以下错误 java.sql.SQLException: ORA-01843: not a valid month
    • ${dih.last_index_time} 存储日期如下 - 2013-07-23 17\:23\:28 。我做错什么了吗?我对这一切都很陌生。如果您能为我提供解决方案,我将不胜感激。 @本
    • 根据手册,时间段是:最少(UNDO保留,闪回档案保留,120小时)。保留期通常很短,不要指望这适用于任何数据超过 5 天的表。
    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2011-12-09
    • 2016-04-03
    • 2017-03-23
    相关资源
    最近更新 更多