Java JDBC - многократная подготовленная внутренняя вставка оператора

Использование JDBC (Oracle) Мне нужно вставить около тысячи строк в каждую из двух таблиц. Что-то вроде этого:

"INSERT INTO TABLE_A (A_ID, A_NAME, A_LAST_NAME) VALUES (MY_SEQUENCE.NEXTVAL, ?, ?)";
"INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (MY_SEQUENCE.CURRVAL, ?)";

Проблема состоит в том, что обе таблицы связаны общей последовательностью, поэтому порядок инструкций важен.

Было бы очень легко, если бы у меня была только одна таблица. В этом случае я использовал код:

String insert = "Insert into TABLE_A(A_ID, A_NAME, A_LAST_NAME) values(MY_SEQUENCE.NEXTVAL, ?, ?)";
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(insert);
for(MyObject obj : myCollection) {
    ps.setString(1, obj.getName());
    ps.setString(2, obj.getLastName());
    ps.addBatch();
}
ps.executeBatch();
conn.commit();
ps.close();

Но этот подход может работать только с одним подготовленным статутом и, таким образом, с одной Insert. Как я могу предоставить решение этой проблемы?

Ответ 1

Вы можете попробовать

PreparedStatement ps = conn.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS);
...
ps.executeBatch();

то

ResultSet rs = ps.getGeneratedKeys();
ps = conn.prepareStatement("INSERT INTO TABLE_B (B_ID, B_DESCRIPTION) VALUES (?, ?)");

for ( int counter =0;rs.next(); counter++ ) { 
  ps.setInt(1,rs.getInt(0));
  ps.setString(2, myCollection.get(counter).getDescription());
  ps.addBatch();
}
...

Ответ 2

Если я правильно понимаю вашу проблему, у вас возникли проблемы с NEXTVAL и CURRVAL, поскольку CURRVAL может измениться из-за использования других БД? Если это так, вы можете изменить свой код на этот порядок:

currentNextVal = select NEXTVAL
INSERT into table_a with currentNextVal as the id
INSERT into table_b with the same currentNextVal 

Я правильно понял вашу проблему?