Db2 11.1

INSERT ステートメントの自動生成キーの取り出し

IBM® Data Server Driver for JDBC and SQLJでは、JDBC 3.0 のメソッドを使用することにより、INSERT ステートメントを実行する際に自動生成されるキーを取り出すことができます。

手順

INSERT ステートメントによって生成される自動生成キーを取り出すには、以下のステップを実行する必要があります。

  1. 以下のいずれかのメソッドを使用して、自動生成キーを返すための設定を行います。
    • PreparedStatement.executeUpdate メソッドを使用して行を挿入する計画がある場合は、以下のいずれかの形式の Connection.prepareStatement メソッドを呼び出して、PreparedStatement オブジェクトを作成します。

      ID 列をサポートしているデータ・ソースの表であれば、以下の形式が有効です。 sql-statement は、単一行の INSERT ステートメントでなければなりません。

      制約事項: IBM Data Server Driver for JDBC and SQLJ バージョン 3.57 以降において、Db2® for z/OS® データ・サーバー上でビューに行を挿入するのに、以下の形式は無効です。
      Connection.prepareStatement(sql-statement, 
        Statement.RETURN_GENERATED_KEYS);

      以下の形式は、データ・ソースが SELECT FROM INSERT ステートメントをサポートしている場合にのみ有効です。 sql-statement は、単一行の INSERT ステートメントでも複数行の INSERT ステートメントでもかまいません。 最初の形式の場合は、自動生成キーを取得する列の名前を指定します。 2 番目の形式の場合は、自動生成キーを取得する列の、表の中での位置を指定します。

      Connection.prepareStatement(sql-statement, String [] columnNames);
      Connection.prepareStatement(sql-statement, int [] columnIndexes);
    • Statement.executeUpdate メソッドを使用して行を挿入する場合は、以下のいずれかの形式の Statement.executeUpdate メソッドを呼び出します。

      ID 列をサポートしているデータ・ソースの表であれば、以下の形式が有効です。 sql-statement は、単一行の INSERT ステートメントでなければなりません。

      制約事項: IBM Data Server Driver for JDBC and SQLJ バージョン 3.57 以降において、Db2 for z/OS データ・サーバー上でビューに行を挿入するのに、以下の形式は無効です。
      Statement.executeUpdate(sql-statement, Statement.RETURN_GENERATED_KEYS);

      以下の形式は、データ・ソースが SELECT FROM INSERT ステートメントをサポートしている場合にのみ有効です。 sql-statement は、単一行の INSERT ステートメントでも複数行の INSERT ステートメントでもかまいません。 最初の形式の場合は、自動生成キーを取得する列の名前を指定します。 2 番目の形式の場合は、自動生成キーを取得する列の、表の中での位置を指定します。

      Statement.executeUpdate(sql-statement, String [] columnNames);
      Statement.executeUpdate(sql-statement, int [] columnIndexes);
  2. PreparedStatement.getGeneratedKeys メソッドまたは Statement.getGeneratedKeys メソッドを呼び出して、自動生成キー値が含まれている ResultSet オブジェクトを取得します。

    Statement.RETURN_GENERATED_KEYS パラメーターを組み込む場合、ResultSet に含まれている自動生成キーのデータ・タイプは、対応する列のデータ・タイプに関わりなく DECIMAL になります。

ID 列が含まれている表を作成し、その表に 1 つの行を挿入し、ID 列の自動生成キー値を取得するコードを以下に示します。 選択されたステートメントの右にある番号は、前述のステップに対応しています。
import java.sql.*;
import java.math.*;
import com.ibm.db2.jcc.*;

Connection con;
Statement stmt;
ResultSet rs;
java.math.BigDecimal iDColVar;
…
stmt = con.createStatement();         // Create a Statement object

stmt.executeUpdate( 
  "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " +
    "IDENTCOL INTEGER GENERATED ALWAYS AS IDENTITY)"); 
                                      // Create table with identity column
stmt.executeUpdate("INSERT INTO EMP_PHONE (EMPNO, PHONENO) " +            1 
  "VALUES ('000010', '5555')",        // Insert a row
  Statement.RETURN_GENERATED_KEYS);   // Indicate you want automatically 
                                      // generated keys
rs = stmt.getGeneratedKeys();         // Retrieve the automatically       2 
                                      // generated key value in a ResultSet.
                                      // Only one row is returned.
                                      // Create ResultSet for query
while (rs.next()) {
  java.math.BigDecimal idColVar = rs.getBigDecimal(1);     
                                      // Get automatically generated key 
                                      // value
  System.out.println("automatically generated key value = " + idColVar);
}
rs.close();                           // Close ResultSet
stmt.close();                         // Close Statement
ID 列が含まれている表を作成し、複数行の INSERT ステートメントを使用してその表に 2 つの行を挿入し、ID 列の自動生成キー値を取得するコードを以下に示します。 選択されたステートメントの右にある番号は、前述のステップに対応しています。
import java.sql.*;
import java.math.*;
import com.ibm.db2.jcc.*;

Connection con;
Statement stmt;
ResultSet rs;
…
stmt = con.createStatement();

stmt.executeUpdate(                                                      
  "CREATE TABLE EMP_PHONE (EMPNO CHAR(6), PHONENO CHAR(4), " +
  "IDENTCOL INTEGER GENERATED ALWAYS AS IDENTITY)");
                                      // Create table with identity column
String[] id_col = {"IDENTCOL"};
int updateCount =                                                         1  
  stmt.executeUpdate("INSERT INTO EMP_PHONE (EMPNO, PHONENO)" +
  "VALUES ('000010', '5555'), ('000020', '5556')", id_col);
                                      // Insert two rows
                                      // Indicate you want automatically
                                      // generated keys
rs = stmt.getGeneratedKeys();         // Retrieve the automatically       2 
                                      // generated key values in a ResultSet.
                                      // Two rows are returned.
                                      // Create ResultSet for query
while (rs.next()) {
 int idColVar = rs.getInt(1);     
                                      // Get automatically generated key
                                      // values
 System.out.println("automatically generated key value = " + idColVar);
}
stmt.close();
con.close();