按顺序批量插入多个表

时间:2019-07-09 08:22:58

标签: java oracle11g batch-insert

在我们的Java应用程序中实现批处理插入代码时,我们面临一个问题。下面是我们的表结构-

  • 我们有三个表:Table1,Table2和Table3。
  • 表1的主键(SeqId,本质上是序列)是其余两个表(表2和表3)的前键。

Table Structure

当前实施:

作为当前批处理操作的一部分,对于每次迭代,我们先在Table1中依次插入,然后依次插入Table2和Table3。

[伪代码]

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将始终采用当前序列值,这不是我们想要的值。重新计算表1中SeqId的每个值,我们要在表2和表3中对应行。

是否可以使用批处理插入(而不是过程或匿名块)来实现此目的?

我们正在使用Oracle 11gJava8

2 个答案:

答案 0 :(得分:1)

我认为您可以使用变量来存储序列值

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;

答案 1 :(得分:0)

您可以检索序列的下一个值,并使用该值填充表格。

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();

//请原谅语法中的任何错误,因为我没有使用任何代码编辑器进行验证。 欢呼