【问题标题】:how to update the previous rows with last_modified date column having null values?如何使用具有空值的 last_modified 日期列更新前几行?
【发布时间】:2014-11-12 15:18:20
【问题描述】:

我有一个加载器表,其中提要每三个小时更新一次并插入记录。一些记录显示 last_modified 日期的 Null 值,即使我有一个检查 last_modified 日期列到 sysdate 的合并。为了将来的目的,我将 last_modified 设置为 sysdate 并启用了 Not NULL 约束。有什么方法可以单独纠正这些记录集以使 last_modified 日期具有正确的时间戳(记录应该具有 last_modified 日期和日期当插入/更新完成时)。

谢谢

【问题讨论】:

  • 如何为旧记录设置 last_modified 日期列?我需要用每条记录的实际修改日期更新表。有没有办法确定每个旧记录的 last_modified_date从加载器表中提取到主表中的记录?

标签: sql oracle plsql


【解决方案1】:

如果您的行被修改“最近足够”,您仍然可以使用SCN_TO_TIMESTAMP 将他们的ora_rowscn 映射到他们的近似修改TIMESTAMP

UPDATE MY_TABLE
    SET Last_Modified = SCN_TO_TIMESTAMP(ora_rowscn)
    WHERE Last_Modified IS NULL;

不过,这不是灵丹妙药。引用文档:

  • 结果值的通常精度为 3 秒。
  • 生成 SCN 时,SCN 和时间戳之间的关联会被数据库记住一段有限的时间。如果数据库在自动撤消管理模式下运行,此期限是自动调整的撤消保留期限的最大值,以及数据库中所有闪回存档的保留时间,但不少于 120 小时。仅当数据库打开时,关联才会过时。如果为 SCN_TO_TIMESTAMP 的参数指定的 SCN 太旧,则会返回错误。

如果您尝试将ora_rowscn 的行映射到允许的窗口之外,您将收到错误ORA-08181 “指定的编号不是有效的系统更改编号”

【讨论】:

  • 非常感谢,但是否可以识别旧记录的 last_modified 日期值?我看到一些 last_modified 列具有 NULL 值,而其他列没有任何空值。当我用 sysdate 更新 last_modified 列时,它们怎么会有两组值下面是我的代码:
  • 不匹配时合并到订单中,然后在不匹配时插入 (d.last_modified,d.order_id,d.source_system) 值 (SYSDATE,s.order_id,s.system) 然后更新 d.last_modified =系统日期;
【解决方案2】:

不,最后修改时间默认不存储在一行中。你必须像现在一样自己做,或者启用某种形式的日记。没有办法更正任何您没有这样做的旧记录。

【讨论】:

  • 我之前已经包含了 last_modified 日期,如果合并发生,last_modified 日期应该设置为 sysdate 但这在合并语句中没有发生..我不明白为什么这甚至会失败虽然 last_modified 设置为 sysdate
猜你喜欢
  • 1970-01-01
  • 2016-03-06
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多