Пакетная вставка в несколько таблиц с последовательностью - PullRequest
2 голосов
/ 09 июля 2019

Мы столкнулись с проблемой при реализации кода пакетной вставки в нашем Java-приложении. Ниже приведена структура нашей таблицы -

  • У нас есть три таблицы: Таблица1, Таблица2 и Таблица3.
  • Первичный ключ таблицы Table1 (SeqId, который по сути является последовательностью) является ключевым ключом для остальных двух таблиц (Table2 и Table3).

Table Structure

Текущая реализация:

Как часть текущей пакетной операции, для каждой итерации мы сначала последовательно вставляем в Таблицу 1, а затем в Таблицу 2 и Таблицу 3.

[Псевдокод]

INSERT INTO Table1(SeqId, OtherField1) VALUES (ID_SEQ.nextval, 'Some Val');
INSERT INTO Table2(SeqId, OtherField1) VALUES (someId2, ID_SEQ.currval, 'Some Val');
INSERT INTO Table3(SeqId, OtherField1) VALUES (someId3, ID_SEQ.currval, 'Some Val');

Что мы пытаемся:

Сейчас мы пытаемся реализовать пакетную вставку. Мы создали три отдельных PreparedStatement и для каждой итерации мы делаем statement.addBatch();, а в самом конце мы выполняем statement.executeBatch() последовательно.

Теперь проблема в том, что ID_SEQ.currval всегда будет принимать текущее значение последовательности, а не то, что мы хотим. Agaist каждое значение SeqId в таблице 1, мы хотим, чтобы соответствующие строки в таблице 2 и таблице 3.

Возможно ли реализовать это с помощью пакетной вставки (не процедуры или анонимного блока)?

Мы используем Oracle 11g и Java8

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Я думаю, вы можете использовать переменную для хранения значения последовательности

DECLARE
   ID_SEQ PLS_INTEGER;
BEGIN
   ID_SEQ  := ID_SEQ.nextval;
   INSERT INTO Table1(SeqId, OtherField1) VALUES (ID_SEQ  , 'Some Val');
   INSERT INTO Table2(SeqId, OtherField1) VALUES (someId2, ID_SEQ  , 'Some Val');
   INSERT INTO Table3(SeqId, OtherField1) VALUES (someId3, ID_SEQ  , 'Some Val');
END;
0 голосов
/ 09 июля 2019

Вы можете получить следующее значение последовательности и заполнить ваши таблицы этим значением.

int seq_val = 0;
ResultSet rs = stmt.execute("SELECT ID_SEQ.NEXTVAL FROM DUAL");
if ( rs.next() ) {
  seq_val = rs.getInt(1);
}

Statement statement = connection.createStatement();
statement.addBatch("INSERT INTO Table1(SeqId, OtherField1)" + "VALUES ("+seq_val+",'some_val')");

statement.addBatch("INSERT INTO Table2(ID,SeqId, OtherField1) " + "VALUES ('some_id',"+seq_val+",'some val')");

statement.addBatch("INSERT INTO Table3(ID,SeqId, OtherField1) " + "VALUES ('some_id',"+seq_val+",'some val')");

statement.executeBatch();

// извините за любые ошибки в синтаксисе, поскольку я не использовал никакого редактора кода для проверки.веселит

...