有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java批插入到具有序列的多个表中

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

  • 我们有三张表:表一、表二和表二;表3
  • 表1的主键(SeqId,本质上是序列)是其余两个表(表2和表3)的外键

Table Structure

当前实施:

作为当前批处理操作的一部分,对于每个迭代,我们先在表1中顺序插入,然后在表2中插入&;表3

[伪代码]

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) 个答案

  1. # 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;
    
  2. # 2 楼答案

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

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

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