2013-03-28 2 views
10

Я вставляю много записей, используя вставки JDBC. Есть ли способ получить сгенерированный ключ для каждой записи? Могу ли я использовать ps.getGeneratedKeys() с пакетными вставками?Как получить сгенерированные ключи из пакетной вставки JDBC в Oracle?

Я использую 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() внутри цикла, чтобы получить желаемый результат. Любые другие решения?

+1

Вы используете последовательности в своих вставках пакета? – Rachcha

+0

Да, StudentSEQ - это последовательность для таблицы. – atripathi

ответ

3

Похоже, что Oracle 12c не поддерживает объединение автоматически сгенерированные ключи с периодическим обновлением в соответствии со следующей страницы:

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

Смотрите подраздел с надписью «Ограничения» в разделе «Извлечение автоселектором Сгенерированные ключи "

6

JDBC 4.1 specification, раздел 13,6 Получение автогенерируемых значения говорит:

Это определяется реализация, будет ли getGeneratedKeys возвращать сгенерированных значения после вызова метода executeBatch.

Так что вам нужно будет проверить, действительно ли ваш драйвер поддерживает его для пакетных обновлений. Как указано в the answer by Philip O., извлечение сгенерированных ключей не поддерживается пакетными обновлениями, как описано в Oracle 12 JDBC Standards Support:

Вы не можете комбинировать автоматически сгенерированные ключи с пакетным обновлением.

В любом случае, если она поддерживается драйвером, чем ваше заявление подготовка должен быть изменен на код ниже, чтобы драйверу получить сгенерированные ключи:

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

Примечание: Вы, возможно, потребуется использовать один из других сгенерированных ключей готовят методы (prepareStatement(sql, columnIndexes) или prepareStatement(sql, columnNames)), поскольку Oracle вернет ROW_ID с помощью метода в моем примере.

Смежные вопросы