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

