【问题标题】:JDBC batch select returns multiple ResultSetsJDBC批量选择返回多个ResultSet
【发布时间】:2012-09-17 10:46:02
【问题描述】:

一个小问题,但我想知道是否有人知道我为什么会出现以下行为。我有一个带有 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

【问题讨论】:

    标签: jdbc


    【解决方案1】:

    这不是执行 UNION 查询,而是批处理 n 单独 查询(即 dbLoadOneQueryn 不同的参数组合),并一次性执行它们,然后检索 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();
    

    【讨论】:

    • 变量“dbLoadOneQuery”中包含的查询是一个包含 UNION 的查询。是的,它正在批处理 n 个不同的调用,但不返回 n 个结果。
    • 那我不明白你的问题。每个批处理查询都有自己的结果集,该结果集将有零个或多个结果。这是意料之中的。我猜您对查询结果的期望与实际输出不符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2014-08-13
    • 2015-12-09
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    相关资源
    最近更新 更多