You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Oracle表查询最新插入/更新的100条记录(兼容11g/12c)

Oracle获取最新100条插入/更新记录通用查询(兼容11g/12c)

以下语句可同时在Oracle 11g、12c及后续版本正常运行,覆盖两类表结构场景,结果包含插入、更新操作产生的最新记录。


场景1:目标数据表未设置任何日期类型列

没有自定义时间列时,可直接使用Oracle内置伪列ORA_ROWSCN判断记录新旧:ORA_ROWSCN记录了行所在数据块最后一次发生修改(插入/更新)的系统变更号,SCN全局单调递增,数值越大代表操作时间越近。
注意:默认配置下ORA_ROWSCN精度为数据块级(同一块内的记录共享同一个SCN),如果需要行级精度,可提前执行ALTER TABLE 你的表名 ENABLE ROW MOVEMENT;开启行级SCN追踪。

查询语句:

SELECT * FROM (
    SELECT t.*,
           SCN_TO_TIMESTAMP(ORA_ROWSCN) AS last_operate_time
    FROM 你的目标表名 t
    ORDER BY ORA_ROWSCN DESC
) WHERE ROWNUM <= 100;

语句中SCN_TO_TIMESTAMP(ORA_ROWSCN)用于将SCN转换为可读的操作时间,不需要可以直接删除该字段。


场景2:目标数据表包含日期类型列

如果表中自带记录操作时间的日期列,优先使用业务时间列排序,精度比ORA_ROWSCN更高:

  • 如果日期列是最后更新时间列(如update_time,插入时赋值、后续更新操作会同步刷新该值),直接按该列倒序取数即可,能同时覆盖插入、更新的最新记录
  • 如果日期列仅为插入时间列(如create_time,仅插入时赋值,更新操作不修改该值),需要结合ORA_ROWSCN联合排序,才能识别到更新产生的新记录

对应查询语句

存在可反映最后修改时间的日期列时使用:

SELECT * FROM (
    SELECT t.*
    FROM 你的目标表名 t
    ORDER BY t.你的日期列名 DESC
) WHERE ROWNUM <= 100;

仅存在插入时间列、需要识别更新记录时使用:

SELECT * FROM (
    SELECT t.*
    FROM 你的目标表名 t
    ORDER BY ORA_ROWSCN DESC, t.你的日期列名 DESC
) WHERE ROWNUM <= 100;

兼容性说明:所有语句均采用Oracle原生ROWNUM分页逻辑,未使用12c版本新增的FETCH FIRST语法,可在11g及以上所有版本稳定运行。

内容的提问来源于stack exchange,提问作者Amit Kumar Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.21 16:16:02