[英]Insert multiple rows in a oracle database from java using getGeneratedKeys() in one statement
I already found out about the INSERT ALL syntax and it works fine as long I don't want to retrieve the inserted id values.我已经发现了 INSERT ALL 语法,只要我不想检索插入的 id 值,它就可以正常工作。
As an opposite to INSERT ALL syntax I could just use mutliple INSERT INTO statements in a transaction which would work but is bad for performance as stated here: Best way to do multi-row insert in Oracle?与 INSERT ALL 语法相反,我可以在事务中使用多个 INSERT INTO 语句,该语句可以工作但对性能不利,如下所述: Best way to do multi-row insert in Oracle? . .
This is my current code:这是我当前的代码:
//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
It works for a single row but if I try the INSERT ALL syntax I get an:它适用于单行,但如果我尝试 INSERT ALL 语法,我会得到:
java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束
Caused by: Error : 933, Position : 187, Sql = INSERT ALL INTO bpos(artnr, bstnr, menge) VALUES (3, 31, 4) INTO bpos(artnr, bstnr, menge) VALUES (5, 31, 6) INTO bpos(artnr, bstnr, menge) VALUES (1, 31, 2) SELECT * FROM dual RETURNING artnr INTO :1 , OriginalSql = INSERT ALL INTO bpos(artnr, bstnr, menge) VALUES (3, 31, 4) INTO bpos(artnr, bstnr, menge) VALUES (5, 31, 6) INTO bpos(artnr, bstnr, menge) VALUES (1, 31, 2) SELECT * FROM dual RETURNING artnr INTO ?, Error Msg = ORA-00933: SQL command not properly ended引起:错误:933,位置:187,Sql = INSERT ALL INTO bpos(artnr, bstnr, menge) VALUES (3, 31, 4) INTO bpos(artnr, bstnr, menge) VALUES (5, 31, 6) INTO bpos(artnr, bstnr, menge) VALUES (1, 31, 2) SELECT * FROM dual RETURNING artnr INTO :1 , OriginalSql = INSERT ALL INTO bpos(artnr, bstnr, menge) VALUES (3, 31, 4) INTO bpos( artnr, bstnr, menge) VALUES (5, 31, 6) INTO bpos(artnr, bstnr, menge) VALUES (1, 31, 2) SELECT * FROM dual RETURNING artnr INTO ?, Error Msg = ORA-00933: SQL command not正确结束
Is it possible to retrieve all inserted ids after an INSERT ALL statement?是否可以在 INSERT ALL 语句后检索所有插入的 ID?
Well, as far as I can tell, it is possible, but not directly (as you could do it with updates or deletes);好吧,据我所知,这是可能的,但不是直接的(因为您可以通过更新或删除来做到); a little workaround has to be used.必须使用一些解决方法。
Here's an example:下面是一个例子:
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>
I don't know, though, can you use it in your (Java?) code as I don't speak that language.不过,我不知道,你能在你的(Java?)代码中使用它,因为我不会说那种语言。
use:用:
statement.executeBatch
not:不是:
statement.executeUpdate
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.