JDBC检索 INSERT 语句的自动生成的密钥

借助适用于 JDBC 和 SQLJ 的 IBM® 数据服务器驱动程序,您可以使用 JDBC 方法来检索在执行 INSERT 语句时自动生成的密钥。

程序

若要检索由 INSERT 语句生成的自动生成的密钥,需要执行以下步骤:

  1. 使用下列方法之一来指示您要返回自动生成的密钥:
    • 如果计划使用“预语句”方法插入行,请调用以下几种形式的连接语句方法之一来创建“预语句”对象:

      以下表单对于支持标识列的任何数据源上的表都有效。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);
  2. 调用“预语句”方法或“语句”生成密钥方法,以检索包含自动生成的键值的结果集对象。

    如果包括 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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值