Oracle - 在同一查询中更新记录和 return 更新日期

Oracle - update record and return updated date in same query

我正在使用 Java 8 与 Spring 的 JdbcTemplate 和 Oracle 12.1,

我想更新记录并获取记录更新的准确时间

jdbcTemplate.update(UPDATE_SQL, null);

目前它 returns (int) 受影响的行数,但我想要确切的更新日期

我必须发送一个新的请求来获取当前时间,这可能不准确吗?

更确切地说是保存在更新日期列中,然后执行另一个 SQL

是否有另一种方法可以在一次查询中获取更新日期?

显然,我也不想使用从代码中获取日期(如 new Date()),因为服务器时间 is/can 与数据库时间

不同

你是对的,传递 new Date() 将存储服务器时间而不是数据库时间。

要存储数据库时间,您可以将时间戳设置为数据库系统时间戳 systimestamp 然后您可以 运行 查询以检索该行及其更新的时间戳。

如果您想在单次执行中更新行并获取更新的时间戳,那么您可以使用 RETURNING INTO 执行以下操作,其中 TimestampUpdated 是您的列名:

Connection con = ...;
String sql = "UPDATE TableName SET <updates> , TimestampUpdated = systimestamp RETURNING TimestampUpdated INTO ?";
CallableStatement statement = con.prepareCall(sql);
statement.registerOutParameter(1, Types.TIMESTAMP);

int updateCount = statement.executeUpdate();
Timestamp timestampUpdated  = statement.getInt(1);
System.out.println("Timestamp Updated = " + timestampUpdated);

Here is a related link 用 JdbcTemplate 做这个

您决定使用 JDBCTemplate 与 plain JDBC 相比,很可能是为了简化代码。

恕我直言,这个特殊问题使 JDBC 中提出的 解决方案简单得多,因此我明确建议获取数据库连接来自 JDBC模板并以 JDBC 方式插入。

我想到的使用 JDBCTemplate 的最简单解决方案是将插入内容包装在 PROCEDURE 和 return 时间戳中作为 OUT 参数。

简单示例(根据需要调整时间逻辑)

create procedure insert_with_return_time (p_str VARCHAR2, p_time OUT DATE) as
BEGIN 
   insert into identity_pk(pad) values(p_str);
   p_time := sysdate;
END;
/

调用是使用SimpleJdbcCall

完成的
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName("insert_with_return_time");
SqlParameterSource params = new MapSqlParameterSource().addValue("p_str", str);
Map<String, Object> out = jdbcCall.execute(params);

Map 包含 returned 值,例如[P_TIME:2019-10-19 11:58:10.0]

但我只能重复,在这个特定的用例中是恕我直言 JDBC 从 JDBCTemplate;)

中拯救