2017-01-18 8 views
0

JDBCバッチステートメントを使用してデータベース(つまりDB2)のレコードのバッチを挿入し、挿入された行の自動生成IDを取得します。 JDBC APIを使用してどのように達成できますか?バッチ挿入ステートメントの自動生成キーを取得する方法は?

コード例:

String SQL_INSERT = "INSERT INTO TABLE1 (CURRENT_TIMESTAMP) VALUES (?) "; 

Connection connection = DriverManager.getConnection("jdbc:db2://localhost:900/DATABASE"); 
PreparedStatement statement = connection.prepareStatement(SQL_INSERT, Statement.RETURN_GENERATED_KEYS); 

// first batch 
statement.setTimestamp(1, getCurrentTimestamp()); 
statement.addBatch(); 

// second batch 
statement.setTimestamp(1, getCurrentTimestamp()); 
statement.addBatch(); 

int[] insertedRows = statement.executeBatch(); 

ResultSet generatedKeys = statement.getGeneratedKeys(); 

バッチ文は、すべての行がデータベースに挿入され、正常に実行します。しかし、生成されたキーを取得するためにgetGeneratedKeys()を呼び出すと、空のResultSetが返されます。どんなアイデア、なぜ?

+1

それは実装依存である

import com.ibm.db2.jcc.DB2PreparedStatement; 

//多くのコード。 JDBCでは、サポートする必要はありません。 –

+0

'int []'または 'String []'を使って自動生成された列を指定するバリエーションを試しましたか? – Stavr00

+0

@ Stavr00はい、バッチ処理のために 'PreparedStatement'にバリアント' int [] 'または' String [] 'を試しましたが、' getGeneratedKeys() 'メソッドでは' ResultSet'は空です。 – fabfas

答えて

0

私はdb2固有の解決策を見つけることができました。 PreparedStatementオブジェクトが自動的に生成されたキーを返す場合は、DB2PreparedStatement.getDBGeneratedKeysを呼び出して、自動的に生成されたキーを含むResultSetのオブジェクトの配列を取得します。生成されたキーを取得バッチ実行でサポートされている場合、ここで

ResultSet[] result = ((DB2PreparedStatement) preparedStatement).getDBGeneratedKeys(); 

for (int i = 0; i < result.length; i++) { 
    while (result[i].next()) { 
     ResultSet rs = result[i]; 
     java.math.BigDecimal generatedKey = rs.getBigDecimal(1); 
     System.out.println("Automatically generated key value = " + generatedKey); 
    } 
} 
関連する問題