JDBC批处理选择返回多个ResultSet

时间:2012-09-17 10:46:03

标签: jdbc

一个小问题,但我想知道是否有人知道我为什么会得到以下行为。我有一个带有UNION指令的大型select语句。我需要将此语句称为输入列表。因此:

Connection connection = createConnection();
PreparedStatement statement = connection.prepareStatement(dbLoadOneQuery, TYPE_FORWARD_ONLY, CONCUR_READ_ONLY);

for (Integer param : params) {
    statement.setInt(1, param);
    statement.setInt(2, param);
    statement.addBatch();
}
statement.execute();

do {
    ResultSet resultSet = statement.getResultSet();
    // snip
} while (statement.getMoreResults());

现在,我知道我可以通过多种方式完成这项工作。是否有更好的方法不是问题。相反,我想知道为什么我的结果会串成一团?我需要从我的陈述中读取3-4个单独的ResultSet。它们与工会不对应,它们的大小不同,而且数据不是任何特定形式的组。

我猜这是一个驱动程序特定的东西,但我找不到允许这种行为的JDBC规范。来自库jconn4的驱动程序为com.sybase.jdbc4.jdbc.SybDriver

jConnect (TM) for JDBC(TM)/7.07 GA(Build 26666)/P/EBF19485/JDK 1.6.0/jdbcmain/Wed Aug 31 03:14:04 PDT 2011

1 个答案:

答案 0 :(得分:1)

这不执行UNION查询,它正在批处理 n 单独的查询(dbLoadOneQuery n 不同的组合参数),并一次执行它们,然后检索 n 单个ResultSet(每个查询一个)。

如果你想要UNION,那么实际执行UNION查询。

根据您的查询,例如:

StringBuilder query = new StringBuilder();
query.append(dbLoadOneQuery);
int queryCount = params.size();
// If we have more than one parameter add a UNION clause:
while (queryCount-- > 1) {
   query.append(" UNION ").append(dbLoadOneQuery);
}
PreparedStatement statement = connection.prepareStatement(query.toString());
int paramIdx = 1;
for (Integer param : params) {
   statement.setInt(paramIdx++, param);
   statement.setInt(paramIdx++, param);
}
ResultSet rs = statement.executeQuery();