我已经发现了INSERT ALL语法,并且只要我不想检索插入的id值,它就可以正常工作。
与INSERT ALL语法相反,我可以在事务中使用多行INSERT INTO语句,该语句可以工作,但对性能不利,如下所述:Best way to do multi-row insert in 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 double returning artnr INTO:1,OriginalSql =将所有内容插入bpos(artnr,bstnr,menge)值(3、31、4)到bpos( artnr,bstnr,menge)值(5、31、6)INTO bpos(artnr,bstnr,menge)值(1、31、2)SELECT * FROM double returning artnr INTO?,错误消息= ORA-00933:SQL命令不行正确结束
是否可以在INSERT ALL语句之后检索所有插入的ID?
最佳答案
好吧,据我所知,这是可能的,但不是直接的(因为您可以通过更新或删除来做到);必须使用一些解决方法。
这是一个例子:
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?)代码中使用它,因为我不会说这种语言。
关于java - 在一条语句中使用getGeneratedKeys()从Java在Oracle数据库中插入多行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53400680/