Вставить несколько строк в базе данных Oracle из Java с помощью getGeneratedKeys () в одном выражении - PullRequest
0 голосов
/ 20 ноября 2018

Я уже узнал о синтаксисе INSERT ALL, и он отлично работает, пока я не хочу извлекать вставленные значения идентификатора.

В противоположность синтаксису INSERT ALL, я мог бы просто использовать mutliple INSERT INTOоператоры в транзакции, которые будут работать, но плохо влияют на производительность, как указано здесь: Лучший способ сделать многострочную вставку в Oracle? .

Это мой текущий код:

//Creation of INSERT INTO statement
//...    
Statement statement = dbConnection.createStatement();
statement.executeUpdate(INSERT_SQL, new String[] {"someIDColumn"});
ResultSet idResulSet = statement.getGeneratedKeys();
//Usage of the generated keys

Это работает для одной строки, но если я попробую синтаксис INSERT ALL, я получу:

java.sql.SQLSyntaxErrorException: ORA-00933: команда SQL неправильно завершена

Причина: ошибка: 933, позиция: 187, Sql = ВСТАВИТЬ ВСЕ В bpos (artnr, bstnr, menge) ЗНАЧЕНИЯ (3, 31, 4) В INTO bpos (artnr, bstnr, menge) ЗНАЧЕНИЯ (5, 31,6) INTO значения bpos (artnr, bstnr, menge) (1, 31, 2) SELECT * FROM с двойным возвратом artnr INTO: 1, OriginalSql = ВСТАВИТЬ ВСЕ В ЗНАЧЕНИЯ bpos (artnr, bstnr, menge) (3, 31, 4)INTO bpos (artnr, bstnr, menge) VALUES (5, 31, 6) INTO bpos (artnr, bstnr, menge) VALUES (1, 31, 2) SELECT * FROM с двойным возвратом artnr INTO?, Ошибка Msg = ORA-00933: команда SQL неправильно завершена

Можно ли получить все вставленные идентификаторы после INSERT ALLутверждение?

1 Ответ

0 голосов
/ 21 ноября 2018

Ну, насколько я могу судить, это возможно, но не напрямую (как вы могли бы сделать это с помощью обновлений или удалений);Небольшой обходной путь должен быть использован.

Вот пример:

SQL> create table test (id number, name varchar2(20));

Table created.

SQL> declare
  2    type    tt_test is table of test%rowtype index by binary_integer;
  3    l_test  tt_test;
  4    l_id    sys.odcinumberlist;
  5  begin
  6    select id, name
  7      bulk collect into l_test
  8      from (select 111 id, 'Little' name from dual union all
  9            select 222 id, 'Foot'   name from dual
 10           );
 11
 12    forall i in l_test.first .. l_test.last
 13      insert into test (id, name) values (l_test(i).id, l_test(i).name)
 14      returning l_test(i).id bulk collect into l_id;
 15
 16    for i in l_id.first .. l_id.last loop
 17      dbms_output.put_line('Inserted ID = ' || l_id(i));
 18    end loop;
 19  end;
 20  /
Inserted ID = 111
Inserted ID = 222

PL/SQL procedure successfully completed.

SQL>

Я не знаю, можете ли вы использовать его в своем коде (Java?), Поскольку я не говорю на этом языке.

...