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個の個別のクエリ(つまり、n個の異なるパラメータの組み合わせ)をバッチ処理 それらdbLoadOneQuery一度に実行してから、 n個の個別のResultSet(クエリごとに1つ)を取得します。

が必要な場合は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();
于 2012-09-19T12:33:31.813 に答える