首页 > 解决方案 > 带返回的更新:无法检索结果集

问题描述

我已经在我的 PostgreSQL 客户端中测试了以下 UPDATE-RETURNING 语句,它正确地更新并返回了更新的行。

但是,在 Java 中,我无法检索 ResultSet。statement.execute()并且statement.getMoreResults()总是返回falsestatement.getResultSet()返回null,总是。

我在这里错过了什么吗?

PreparedStatement statement = this.prepareStatement(
    "WITH temp AS (" +
    "    SELECT id" +
    "    FROM mytable " +
    "    LIMIT 5 "
    ") " +
    "UPDATE mytable " +
    "SET updated = NOW() " +
    "FROM temp " +
    "WHERE temp.id = mytable.id " +
    "RETURNING mytable.data"
);

boolean hasResult = statement.execute();

if (!hasResult) {
    hasResult = statement.getMoreResults();
    // hasResult is still false
    // statement.getResultSet() still returns null
} else {
    // statement.getUpdateCount() returns the correct count of updated rows
}

标签: javasqlpostgresqljdbc

解决方案


来自的返回码execute()指示是否有立即可用的结果。

getMoreResults()告诉您在处理通过 . 的返回值指示的第一个结果集是否还有另一个结果集。execute()

因此,以下内容适用于您的 UPDATE 语句:

boolean hasResult = statement.execute();
if (hasResult) {
  ResultSet rs = statement.getResultSet();
  ... process the result ...
}

请注意,即使 UPDATE 实际上没有更改任何行(例如,因为 WHERE 子句不匹配任何内容),您也会得到一个 ResultSet。当您调用时,结果集将立即返回 false next()


您只需要检查getMoreResults()您是否期望多个 ResultSet。然后你需要一个循环:

boolean hasResult = statement.execute();
while (hasResult) {
  ResultSet rs = statement.getResultSet();
  .... process the result ...

  // check if there is another one
  hasResult = statement.getMoreResults();
}

理论上,您还需要检查getUpdateCount()循环。如果数据库返回结果集和更新计数的混合,这将是必需的。不确定 Postgres 是否真的支持这一点。


推荐阅读