12

JDBC バッチ挿入を使用して多くのレコードを挿入しています。レコードごとに生成されたキーを取得する方法はありますか? ps.getGeneratedKeys()一括挿入で使用できますか?

私は使っているoracle.jdbc.OracleDriver

final String insert = "Insert into Student(RollNumber, Name, Age) values(StudentSEQ.nextval, ? , ?)";
final int BATCH_SIZE = 998;
int count = 0;
Connection con = null;
PreparedStatement ps =  null;
try {
    con = getConnection();
    ps = con.prepareStatement(insert);
    for (Student s : students) {
        ps.setString(1, s.getName());
        ps.setInt(2, s.getAge());
        ps.addBatch();
        count++;
        if (count % BATCH_SIZE == 0) {
        // Insert records in batches
            ps.executeBatch();
        }
    }
    // Insert remaining records
    ps.executeBatch();
} finally {
    if(ps != null)
        ps.close();
    release(con);
}

目的の結果を得るために、ループ内で使用ps.executeUpdate()することを考えています。ps.getGeneratedKeys()他の解決策はありますか?

4

2 に答える 2

7

JDBC 4.1 仕様、セクション 13.6自動生成された値の取得 は次のように述べています。

getGeneratedKeysメソッドの呼び出し後に が生成された値を返すかどうかは実装定義executeBatchです。

そのため、ドライバーが実際にバッチ更新をサポートしているかどうかを確認する必要があります。Philip O. の回答に示されているように、生成されたキーの取得は、 Oracle 12 JDBC Standards Supportに記載されているバッチ更新ではサポートされていません。

自動生成されたキーをバッチ更新と組み合わせることはできません。

いずれの場合でも、ドライバーでサポートされている場合は、生成されたキーを取得するようにドライバーに指示するために、ステートメントの準備を以下のコードに変更する必要があります。

ps = con.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS);

prepareStatement(sql, columnIndexes)注: 他の生成されたキー準備メソッド (または)のいずれかを使用する必要がある場合があります。これはprepareStatement(sql, columnNames)、Oracle がROW_IDこの例のメソッドで を返すためです。

于 2013-03-28T14:49:07.683 に答える
3

次のページによると、Oracle 12c は、自動生成されたキーとバッチ更新の組み合わせをサポートしていないようです。

http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbcvers.htm

「自動生成キーの取得」セクションの下にある「制限事項」というサブセクションを参照してください。

于 2013-08-07T16:20:15.513 に答える