在我们的Java应用程序中实现批处理插入代码时,我们面临一个问题。下面是我们的表结构-
当前实施:
作为当前批处理操作的一部分,对于每次迭代,我们先在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 11g
和Java8
答案 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();
//请原谅语法中的任何错误,因为我没有使用任何代码编辑器进行验证。 欢呼