Oracle - обновить запись и вернуть обновленную дату в том же запросе - PullRequest
1 голос
/ 15 октября 2019

Я использую Java 8 с JdbcTemplate Spring и Oracle 12.1,

Я хочу обновить запись и получить точное время обновления записи

jdbcTemplate.update(UPDATE_SQL, null);

В настоящее время возвращается (int) количество затронутых строк, но мне нужна точная дата обновления

Должен ли я отправить новый запрос, чтобы узнать текущее время, которое может быть неточным?

Точнее будет сохранить в столбце дату обновления, но затем выполнить другой SQL

Есть ли другой способ получить дату обновления в одном запросе?

Очевидно, яне хочу использовать дату получения из кода также (как new Date()) также потому, что время сервера отличается от времени БД

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Вы решили использовать JDBCTemplate, скорее всего, для упрощения кода по сравнению с plain JDBC .

Эта конкретная проблема IMHO делает решение plain JDBC , предложенное в другой ответ , намного проще, поэтому я бы настоятельно рекомендовал получить соединение с базой данных из JDBCTemplate и сделатьвставка способом JDBC.

Самое простое решение, использующее JDBCTemplate, которое мне приходит в голову, - это вставить вставку в PROCEDURE и вернуть метку времени в качестве параметра 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 содержит возвращаемое значение, например, [P_TIME:2019-10-19 11:58:10.0]

Но я могу только повторить, в данном конкретном случае использования IMHO JDBC спасение от JDBCTemplate ;)

1 голос
/ 15 октября 2019

Вы правы, что передача 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);

Вот связанная ссылка , делающая это с JdbcTemplate

...