如何从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
相关产品推荐
相关产品推荐

