java - 带返回的更新:无法检索结果集
问题描述
我已经在我的 PostgreSQL 客户端中测试了以下 UPDATE-RETURNING 语句,它正确地更新并返回了更新的行。
但是,在 Java 中,我无法检索 ResultSet。statement.execute()
并且statement.getMoreResults()
总是返回false
和statement.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
}
解决方案
来自的返回码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 是否真的支持这一点。
推荐阅读
- c++ - 防止 clr 编译器将方法转换为 c#
- bash - 在bash中卷曲列表
- amazon-web-services - 将 AWS S3 中的数据转换为另一个架构结构(也在 S3 中)
- python - 生成给定日期之间的季度列表
- python - 如何使用 Scrapy 进行 URL 抓取
- android-source - 当我在几个小时后运行 CTS 时,与设备的 adb 连接变得无响应
- javascript - 如何使用代理
使用与 T 不同的类型作为参数? - ios - 将数据从 MainView 传递到 ContainerView
- javascript - 如何使旧版 Firefox 支持 Angular 5 应用程序?
- ansible - Ansible 在运行用于创建符号链接的 shell 命令时卡住了