JDBC 3.0のキー自動生成に関する機能により、索引の一部あるいは既定値の割り当てられた列から値を取得する方法があります。
には自動増分の機能があって、この機能により、データベースにより自動的に増分された値をとる列を、ユーザは表に定義することができます。
JDBC 3.0ではStatement.getGeneratedKeysメソッドを呼んでこの種類の列の値を取得することができます。このメソッドは値に自動生成キーをとる列を持つResultSetを返します。
またgetGeneratedKeysから返されたResultSetオブジェクトにてResultSet.getMetaDataメソッドを呼んで、IDENTITY_VAL_LOCALから返るのと同様なResultSetMetaDataオブジェクトを得ることもできます。
ユーザはConnection.prepareStatementメソッドや、Statement.executeメソッド、Statement.executeUpdateメソッドの二つ目の引数に、以下に示すいずれかの値を渡すことで、自動生成された列を取得できます。
- 自動生成されたキーを取得できるようにする定数。具体的にはStatement.RETURN_GENERATED_KEYSです。
- 挿入する行の列の内、取得できるようにする列名の配列。配列にある列名のいずれも自動生成される列で無ければ、 は例外を挙げます。(なおこの引数は、では組み込みドライバでのみ利用可能です。)
- 挿入する行の列の内、取得できるようにする列位置の配列。配列のいずれも自動生成される列でなければ、は例外を挙げます。(この引数はでは組み込みドライバでのみ利用可能です。)
例
以下のように定義されたTABLE1という表があるとします。
CREATE TABLE TABLE1 (C11 int, C12 int GENERATED ALWAYS AS IDENTITY)
以下の三つのコードは同じことを行います。すなわち、TABLE1に挿入されたC12 の値を持つ、ResultSetを生成します。
コード 1:
Statement stmt = conn.createStatement();
stmt.execute(
"INSERT INTO TABLE1 (C11) VALUES (1)",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
コード 2:
Statement stmt = conn.createStatement();
String [] colNames = new String [] { "C12" };
stmt.execute(
"INSERT INTO TABLE1 (C11) VALUES (1)",
colNames);
ResultSet rs = stmt.getGeneratedKeys();
コード 3:
Statement stmt = conn.createStatement();
int [] colIndexes = new int [] { 2 };
stmt.execute(
"INSERT INTO TABLE1 (C11) VALUES (1)",
colIndexes);
ResultSet rs = stmt.getGeneratedKeys();
もし自動生成された列を取得できるようにする指定がなければ、
Statement.getGeneratedKeysへの呼び出しはnullのResultSetを返します。