【问题标题】:Oracle - update record and return updated date in same queryOracle - 在同一查询中更新记录并返回更新日期
【发布时间】:2019-10-15 14:25:21
【问题描述】:

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

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

jdbcTemplate.update(UPDATE_SQL, null);

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

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

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

还有其他选项可以在一个查询中获取更新日期吗?

显然,我也不想使用从代码中获取日期(如 new Date()),因为服务器时间是/可以不同于数据库时间

【问题讨论】:

  • 如果更新完成,我认为您可以在服务器端自行处理;取当前服务器时间。我相信它可能会相差几毫秒,但这仍然是可行和可接受的。
  • @MohamedSweelam 添加了一条我不想要这种方法的评论,也是因为服务器时间与 DB 时间不同
  • 如果您执行UPDATE TableName SET ColumnName = systimestamp WHERE...,那么您可以运行查询来检索数据库进行更新时的时间戳。
  • @xtratic 是的,我在我的问题中写了它,但我想要 1 个 SQL
  • @user7294900 我的回答中给出的示例

标签: java oracle sql-update jdbctemplate


【解决方案1】:

普通的 JDBC 相比,您决定使用 JDBCTemplate 很可能是为了简化代码。

恕我直言,这个特殊问题使得other answer 中提出的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]

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

【讨论】:

    【解决方案2】:

    你是对的,传递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 进行此操作

    【讨论】:

    • 谢谢,我提到我用的是Spring的JdbcTemplate
    • returning into 只能在 PL/SQL 块内使用,不能用于普通 SQL
    • 谢谢,我明天去看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2021-12-05
    • 2018-03-07
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多