借助适用于 JDBC 和 SQLJ 的 IBM® 数据服务器驱动程序,您可以使用 JDBC 方法来检索在执行 INSERT 语句时自动生成的密钥。
程序
若要检索由 INSERT 语句生成的自动生成的密钥,需要执行以下步骤:
- 使用下列方法之一来指示您要返回自动生成的密钥:
- 如果计划使用“预语句”方法插入行,请调用以下几种形式的连接语句方法之一来创建“预语句”对象:
以下表单对于支持标识列的任何数据源上的表都有效。SQL 语句必须是单行插入语句。
限制:对于适用于 JDBC 和 SQLJ V3.57 或更高版本的 IBM 数据服务器驱动程序,以下形式对于将行插入到 Db2® for z/OS® 数据服务器上的视图中无效。Connection.prepareStatement(sql-statement, Statement.RETURN_GENERATED_KEYS);
仅当数据源支持“从插入中选择”语句时,以下表单才有效。 可以是单行 INSERT 语句或多行 INSERT 语句。使用第一个窗体,指定要为其自动生成密钥的列的名称。使用第二个窗体,您可以在要为其自动生成键的列表中指定位置。sql-statement
Connection.prepareStatement(sql-statement, String [] columnNames); Connection.prepareStatement(sql-statement, int [] columnIndexes);
- 如果使用语句执行更新方法插入行,请调用以下形式的语句执行更新方法之一:
以下表单对于支持标识列的任何数据源上的表都有效。SQL 语句必须是单行插入语句。
限制:对于适用于 JDBC 和 SQLJ V3.57 或更高版本的 IBM 数据服务器驱动程序,以下形式对于将行插入到 Db2 for z/OS 数据服务器上的视图中无效。Statement.executeUpdate(sql-statement, Statement.RETURN_GENERATED_KEYS);
仅当数据源支持“从插入中选择”语句时,以下表单才有效。 可以是单行 INSERT 语句或多行 INSERT 语句。使用第一个窗体,指定要为其自动生成密钥的列的名称。使用第二个窗体,您可以在要为其自动生成键的列表中指定位置。sql-statement
Statement.executeUpdate(sql-statement, String [] columnNames); Statement.executeUpdate(sql-statement, int [] columnIndexes);
- 如果计划使用“预语句”方法插入行,请调用以下几种形式的连接语句方法之一来创建“预语句”对象:
- 调用“预语句”方法或“语句”生成密钥方法,以检索包含自动生成的键值的结果集对象。
如果包括 Statement.RETURN_GENERATED_KEYS 参数,则无论相应列的数据类型如何,结果集中自动生成的键的数据类型都是 DECIMAL。
例
下面的代码创建一个具有标识列的表,在该表中插入一行,并检索为标识列自动生成的键值。所选语句右侧的数字对应于前面描述的步骤。
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
下面的代码创建一个具有标识列的表,使用多行 INSERT 语句在表中插入两行,并检索为标识列自动生成的键值。所选语句右侧的数字对应于前面描述的步骤。
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();