Oracle-更新记录并在同一查询中返回更新日期

时间:2019-10-15 14:25:21

标签: java oracle sql-update jdbctemplate

我将Java 8与Spring的JdbcTemplate和Oracle 12.1结合使用,

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

jdbcTemplate.update(UPDATE_SQL, null);

当前它返回(int)受影响的行数,但是我想要确切的更新日期

我必须发送新请求以获取当前时间可能不正确吗?

更确切的做法是将更新日期保存在列中,然后执行另一个SQL

是否还有另一个选项可以在一个查询中获取更新日期?

很明显,我也不想使用代码中的获取日期(如new Date()),这也是因为服务器时间与DB Time不同/可能与DB Time不同

2 个答案:

答案 0 :(得分:1)

您是对的,传递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做到这一点

答案 1 :(得分:1)

纯JDBC 相比,您决定最可能使用JDBCTemplate来简化代码。

这个特殊的问题,恕我直言,使other answer中提出的普通JDBC 解决方案更加简单,因此,我绝对建议从JDBCTemplate获取数据库连接,并在JDBC中进行插入方式。

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

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

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包含返回值,例如[P_TIME:2019-10-19 11:58:10.0]

但是我只能重复一遍,在这个特殊的用例中,恕我直言 JDBC是JDBCTemplate的救助;)