当前位置: 首页 > 知识库问答 >
问题:

在一条语句中使用getGeneratedKeys()从java向oracle数据库中插入多行

姜德泽
2023-03-14

我已经了解了INSERT ALL语法,只要我不想检索插入的id值,它就可以正常工作。

与INSERT ALL语法相反,我可以在事务中使用多个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

它适用于单行,但如果我尝试插入所有语法,我会得到一个:

Java . SQL . sqlsyntaxerrorexception:ORA-00933:SQL命令未正确结束

由以下原因引起:错误:933,位置:187,Sql=将所有值插入到bpos(artnr,bstnr,menge)值(3,31,4)中,将bpos(RTNR,bstnr,menge)值(5,31,6)插入到BPO(artnr,BSTN,Menges)值(1,31,2)中,从双返回artnr值中选择*将其插入:1,OriginalSql=将所有值插入BPO(artnr、bstnr、menge)值(3、31、4)中,将BPO(artnr、bstnr、menge)值插入bpos(5、31、6)中,并将所有值(1、31、2)从对偶中选择*并将artnr返回到?,错误Msg=ORA-00933:SQL命令未正确结束

是否可以在INSERT ALL语句之后检索所有插入的id?

共有2个答案

何甫
2023-03-14

使用:

statement.executeBatch

不是:

statement.executeUpdate
林俊英
2023-03-14

嗯,据我所知,这是可能的,但不是直接的(因为你可以用更新或删除);必须使用一点变通方法。

这里有一个例子:

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?)代码,因为我不会说那种语言

 类似资料:
  • 本文向大家介绍用一条mysql语句插入多条数据,包括了用一条mysql语句插入多条数据的使用技巧和注意事项,需要的朋友参考一下        假如有一个数据表A: id name title addtime         如果需要插入n条数据 :    之前我的想法会是,通过数据构造多条插入语句,循环调用 。如:         之后发现了sql的insert语句可以一次插入多条:       

  • 如本文所示,此功能在MySQL中可用,根据Sybase文档,它也应该得到支持,但是Sybase没有提供工作示例,因此您必须解释以下内容: 语法1使用指定的表达式列值插入单行或多行。如果指定,多行由附加括号分隔 因此,我将“附加括号”解释为期望下面的代码能够工作 然而,它错误地 我使用的是Sybase ASE 15,在INSERT语句的支持页面上看不到任何关于插入多行的引用 这个功能在赛贝斯可用吗?

  • 问题内容: 我是Web服务的新手。请提出建议,如何在Java中使用Jersey JAX-RS从数据库中插入和检索数据? 问题答案: 下面是一个示例 JAX-RS 服务的示例,该示例使用 JPA 进行持久性而使用 JAXB 进行消息传递时,实现为会话Bean 。 客户服务 顾客 以下是其中一个实体的示例。它包含JPA和JAXB批注。 想要查询更多的信息 第1部分-数据模型 第2部分-JPA 第3部分

  • 问题内容: 我正在尝试编写一个docker文件,该文件将运行RUN命令以在package.json文件中搜索单词并对其执行操作: 这是我简单的dockerfile: 如您所见,我只想要一个简单的if语句,但它得到此错误: 我应该如何运行命令?谢谢。 问题答案: 就像在shell上键入内容一样,您需要在前面加上换行符或分号:

  • 我想向数据库中插入值,但它无法工作,尽管我的代码在用作存储过程时运行良好。我需要使用按钮点击来存储值。请告诉我代码有什么问题。它没有显示任何错误或异常,但表中的数据没有更新

  • 下面是准备好的语句代码的片段: 它完成工作,但只有在数百次插入之后。是否有方法将列表或数组绑定到bind_param()参数,只需运行$stmtability->execute one time或其他可以提高性能的方法。 抱歉,如果这是问和回答之前。我四处看了一会儿,发现了一些类似的问题,但没有什么能明确地回答我的要求。