0

一个小问题,但我想知道是否有人知道我为什么会出现以下行为。我有一个带有 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 规范。驱动程序com.sybase.jdbc4.jdbc.SybDriver来自库 jconn4。

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
4

1 回答 1

1

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

如果你想要UNIONs,那么实际执行一个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();
于 2012-09-19T12:33:31.813 回答