我将Java 8与Spring的JdbcTemplate
和Oracle 12.1结合使用,
我想更新记录并获取更新的准确时间
jdbcTemplate.update(UPDATE_SQL, null);
当前它返回(int)受影响的行数,但是我想要确切的更新日期
我必须发送新请求以获取当前时间可能不正确吗?
更确切的做法是将更新日期保存在列中,然后执行另一个SQL
是否还有另一个选项可以在一个查询中获取更新日期?
很明显,我也不想使用代码中的获取日期(如new Date()
),这也是因为服务器时间与DB Time不同/可能与DB Time不同
答案 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的救助;)