批量向多个表中按顺序插入数据

3
我们在Java应用程序中实现批量插入代码时遇到了问题。以下是我们的表结构 -
  • 我们有三个表:Table1,Table2和Table3。
  • Table1的主键SeqId(本质上是序列)是其余两个表(Table2和Table3)的外键。

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将始终获取当前序列值,这不是我们想要的。对于Table1中的每个SeqId值,我们希望在Table2和Table3中有相应的行。

是否可能使用批量插入来实现这一点(而不是使用过程或匿名块)?

我们使用的是Oracle 11gJava8

2个回答

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;

我需要一个Java解决方案,从匿名块中我知道如何做到这一点。 - Kartic
@Kartic,你能否在Java中调用匿名块而不是使用单独的SQL语句吗? - Jon Heller

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

//如果有语法错误请见谅,因为我没有使用任何代码编辑器进行验证。 干杯


我想到了这个,但是这并不比我们当前的实现更好,因为每次迭代都需要触发一个select语句。有人能验证这是否是唯一的方法吗? - Kartic
你能分享一下你提到的foreach语句吗?也许这会给我一些启示。 - morrisng
循环是为了获取OtherField的值。没有其他逻辑。我不知道,但如果有任何方法可以将多个语句分组并作为单个单元执行,那就可以了。不确定是否可行。 - Kartic
@Kartic,你决定了哪个答案适合你了吗?还是你采用了不同的方法?请告诉我们。 - morrisng
我会坚持当前的实现,因为我感觉我的实际问题没有真正的解决方案。 - Kartic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接