2014年12月22日月曜日

[Oracle12c]generatedカラムの値をJDBC経由でinsert後に取得する

Oracle12cで追加された自動生成カラムの値を、JDBC経由でINSERTを行った際に取得する方法です。

コードサンプル

テーブル定義

CREATE TABLE USER_INFO
(
    ID INTEGER PRIMARY KEY NOT NULL,
    NAME VARCHAR2(100)
)

Javaコード

PreparedStatement statement = connection
        .prepareStatement(
                "insert into USER_INFO (name) values (?)",
                new String[]{"id"});
statement.setString(1, "なまえ");
int count = statement.executeUpdate();
System.out.println("count = " + count);

try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
    if (generatedKeys.next()) {
        System.out.println(generatedKeys.getInt(1));
    }
}

解説

PreparedStatement生成時に、自動生成キーを返す機能を持つPreparedStatementを生成します。
上のサンプルでは、自動生成カラムはID列なので、prepareStatementの2番めの引数にID列を指定しています。

必要な値をバインド後に、executeUpdateを呼び出してINSERT処理を実行します。

INSERT処理が正常に終了後、getGeneratedKeysを呼び出して、自動生成カラムに対して自動的に採番されて設定された値を取得します。
getGeneratedKeysは、ResultSetを返すのでフェッチ(nextメソッドの呼び出し)しながら値を取得していきます。
Oracleでは、getGeneratedKeysで返されるResultSetからの値の取得はインデックスのみ可能なので、カラム名によるアクセスは出来ません。