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

如何获取Oracle表中最后更新的行?以Employees表为例的查询方法

Oracle查询Employees表最近更新记录的实现方案

以下是不同场景下的可行实现方式:

场景1:表内有维护更新时间的专用字段

这是生产环境最推荐的方案,通常表设计时会预留LAST_UPDATE_DATE字段,插入、更新操作时自动维护该字段的时间值。

  • 单条最新记录查询(Oracle 12c及以上版本)
SELECT * 
FROM Employees 
ORDER BY LAST_UPDATE_DATE DESC 
FETCH FIRST 1 ROW ONLY;
  • 单条最新记录查询(Oracle 12c以下版本,适配ROWNUM语法)
SELECT * 
FROM (
    SELECT * 
    FROM Employees 
    ORDER BY LAST_UPDATE_DATE DESC
) 
WHERE ROWNUM = 1;
  • 批量更新场景,查询同一时间最新更新的所有匹配记录
SELECT * 
FROM Employees 
WHERE LAST_UPDATE_DATE = (
    SELECT MAX(LAST_UPDATE_DATE) 
    FROM Employees
);

场景2:表内没有专用更新时间字段

可以使用Oracle原生的ORA_ROWSCN伪列,它记录了每行最后一次更新对应的系统提交号。

注意:表默认是数据块级别的ORA_ROWSCN,同一数据块内的行的ORA_ROWSCN会相同,查询结果可能存在偏差。如果需要精确到行级别的记录,建表时需要开启ROWDEPENDENCIES属性,该方案仅适合临时查询使用,生产环境建议补充更新时间字段。

-- Oracle 12c及以上版本
SELECT * 
FROM Employees 
ORDER BY ORA_ROWSCN DESC 
FETCH FIRST 1 ROW ONLY;

-- Oracle 12c以下版本
SELECT * 
FROM (
    SELECT * 
    FROM Employees 
    ORDER BY ORA_ROWSCN DESC
) 
WHERE ROWNUM = 1;

场景3:当前会话刚执行更新操作还未提交

可以直接在UPDATE语句中加RETURNING子句,更新的同时直接返回修改的记录,无需后续额外查询:

-- 单条更新返回
UPDATE Employees 
SET salary = salary * 1.1 
WHERE employee_id = 1001
RETURNING employee_id, first_name, last_name, salary INTO :emp_id, :f_name, :l_name, :new_salary;

-- 多条更新批量返回
UPDATE Employees 
SET salary = salary * 1.1 
WHERE department_id = 20
RETURNING employee_id, first_name, last_name, salary BULK COLLECT INTO :emp_list;

内容的提问来源于stack exchange,提问作者Anaidm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:06:06