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

Java Oracle-在同一查询中更新记录并返回更新日期,java,oracle,sql-update,jdbctemplate,Java,Oracle,Sql Update,Jdbctemplate,我将Java 8与Spring的JdbcTemplate和Oracle 12.1一起使用 我想更新记录并获得记录更新的准确时间 jdbcTemplate.update(UPDATE_SQL, null); 目前,它返回(int)受影响的行数,但我需要确切的更新日期 我必须发送一个新的请求来获取可能不准确的当前时间吗 更准确的方法是将更新日期保存在列中,然后执行另一个SQL 是否有其他选项可以在一个查询中获取更新日期 显然,我也不想使用get date from code(如new date()

我将Java 8与Spring的
JdbcTemplate
和Oracle 12.1一起使用

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

jdbcTemplate.update(UPDATE_SQL, null);
目前,它返回(int)受影响的行数,但我需要确切的更新日期

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

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

是否有其他选项可以在一个查询中获取更新日期


显然,我也不想使用get date from code(如
new date()
),这也是因为服务器时间与数据库时间不同

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

如果要更新行并在一次执行中获得更新的时间戳,则可以使用
返回到
中执行以下操作,其中
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);
连接con=。。。;
String sql=“UPDATE TableName SET,TimestampUpdated=systimestamp返回TimestampUpdated到?”;
CallableStatement语句=con.prepareCall(sql);
registerOutParameter(1,Types.TIMESTAMP);
int updateCount=statement.executeUpdate();
Timestamp Timestamp updated=statement.getInt(1);
System.out.println(“Timestamp Updated=“+Timestamp Updated”);

使用JdbcTemplate执行此操作时,您决定使用JdbcTemplate,与普通JDBC相比,很可能是为了简化代码

IMHO的这个特殊问题使得中提出的普通JDBC解决方案更加简单,因此我明确建议从JDBCTemplate获取数据库连接,并以JDBC方式进行插入

我想到的使用JDBCTemplate的最简单解决方案是将insert包装在
过程中
,并将时间戳作为
输出
参数返回

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

调用是使用
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);
SimpleJdbcCall jdbcall=new SimpleJdbcCall(jdbcTemplate).withProcedureName(“insert_with_return_time”);
SqlParameterSource params=新的MapSqlParameterSource().addValue(“p_str”,str);
Map out=jdbcCall.execute(params);
Map
包含返回值,例如
[p\u时间:2019-10-19 11:58:10.0]


但我只能重复一次,在这个特定的用例中,IMHO JDBC是从JDBCTemplate中拯救出来的;)

我认为你可以在服务器端自己处理它,如果更新完成的话;使用当前服务器时间。我相信它可能会在几毫秒内有所不同,但这仍然是可行和可接受的。@MohamedSweelam补充道,我不希望采用这种方法,另外,由于服务器时间与数据库时间不同,如果执行
更新TableName SET ColumnName=systimestamp WHERE…
,则可以在数据库进行更新时运行查询以检索该时间戳。@xtratic是的,我在问题中写了它,但我想要1SQL@user7294900在我的回答中给出的例子谢谢,我提到我使用Spring的
JdbcTemplate
返回到
只能在PL/SQL块中使用,不能与普通的SQL一起使用谢谢,我明天会检查
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);