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;)
中拯救
我正在使用 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 中提出的
我想到的使用 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;)
中拯救