如何获得产生从JDBC批量插入钥匙在甲骨文?(How to get generated keys f

2019-08-18 02:58发布

我将使用JDBC批量插入多条记录。 有没有办法让每个记录生成的密钥? 我可以使用ps.getGeneratedKeys()与批量插入?

我使用oracle.jdbc.OracleDriver

final String insert = "Insert into Student(RollNumber, Name, Age) values(StudentSEQ.nextval, ? , ?)";
final int BATCH_SIZE = 998;
int count = 0;
Connection con = null;
PreparedStatement ps =  null;
try {
    con = getConnection();
    ps = con.prepareStatement(insert);
    for (Student s : students) {
        ps.setString(1, s.getName());
        ps.setInt(2, s.getAge());
        ps.addBatch();
        count++;
        if (count % BATCH_SIZE == 0) {
        // Insert records in batches
            ps.executeBatch();
        }
    }
    // Insert remaining records
    ps.executeBatch();
} finally {
    if(ps != null)
        ps.close();
    release(con);
}

我想使用的ps.executeUpdate()连同ps.getGeneratedKeys()内循环,以获得期望的结果。 任何其他解决办法?

Answer 1:

看来,甲骨文12C不支持自动生成键同按以下网页批量更新相结合:

http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbcvers.htm

看到标有小标题“限制”部分下的“自动生成关键字检索”



Answer 2:

在JDBC 4.1规范 ,部分13.6 检索自动生成的值表示:

它是实现定义是否getGeneratedKeys将调用返回之后产生的值executeBatch方法。

所以,你需要检查你的司机居然支持它批量更新。 正如指出的菲利普O.答案 ,生成密钥的检索不与批更新中记载支持甲骨文12 JDBC标准的支持 :

你不能批量更新相结合自动生成的键。

在任何情况下,如果你的驱动比你的发言准备应改为下面的代码指示司机检索生成的密钥的支持:

ps = con.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS);

注意:您可能需要使用其他的生成的密钥准备方法之一( prepareStatement(sql, columnIndexes)prepareStatement(sql, columnNames)作为甲骨文将返回ROW_ID在我的例子方法。



文章来源: How to get generated keys from JDBC batch insert in Oracle?