2

次のように、ログ ID を tableA に挿入するために Oracle シーケンスを使用しています。

String SQL_PREP_INSERT = "INSERT INTO tableA (LOG_ID,USER_ID,EXEC_TIME) VALUES"
            + " (logid_seq.nextval, ?, ?)";

次に、最近挿入された値を取得し、

String SQL_PREP_SEL = "SELECT max(LOG_ID) FROM tableA ";

stmt = con.prepareStatement(SQL_PREP_SEL);
stmt.execute();
ResultSet rs = stmt.getResultSet();
if (rs.next()) {
logid = rs.getInt(1);
}

それをtableBに挿入すると、

String SQL_PREP_INSERT_DETAIL = "INSERT INTO tableB (LOG_ID, RESPONSE_CODE, RESPONSE_MSG) VALUES"
                + " (?, ?)";

        stmt = con.prepareStatement(SQL_PREP_INSERT_DETAIL);
        stmt.setInt(1, logid);
        stmt.setString(2, respCode);
        stmt.setString(3, respMsg);
        stmt.execute();

tableA から選択して tableB に挿入する代わりに、Oracle ではなく Java でシーケンスを生成し、両方のテーブルに同時に挿入する方法はありますか?

4

2 に答える 2

7

一般に、 を選択しても、提供されMAX(log_id)たものと同じ値は得られませんlogid_seq.nextval。これがマルチユーザー システムであると仮定すると、log_idクエリが実行される前に、他のユーザーが挿入した行よりも大きな値を持つ別の行を挿入した可能性があります。

両方のステートメントが同じセッションで実行されると仮定すると、INSERTおそらく最も簡単なオプションはlogid_seq.currval、2 番目のINSERTステートメントで を使用することです。 currval現在のセッションに返されたシーケンスの最後の値を返すためnextval、最初のステートメントの呼び出しによって生成された値と常に同じ値を返します。

INSERT INTO tableB (LOG_ID, RESPONSE_CODE, RESPONSE_MSG) 
  VALUES( logid_seq.currval, ?, ? )

または、RETURNING最初のステートメントで句を使用して、シーケンス値をローカル変数にフェッチし、それを 2 番目のINSERTステートメントで使用することもできます。しかし、それは単にcurrval.

于 2012-04-23T17:09:20.167 に答える
0
String QUERY = "INSERT INTO students "+
               "  VALUES (student_seq.NEXTVAL,"+
               "         'Harry', 'harry@hogwarts.edu', '31-July-1980')";

// load oracle driver
Class.forName("oracle.jdbc.driver.OracleDriver");

// get database connection from connection string
Connection connection = DriverManager.getConnection(
        "jdbc:oracle:thin:@localhost:1521:sample", "scott", "tiger");

// prepare statement to execute insert query
// note the 2nd argument passed to prepareStatement() method
// pass name of primary key column, in this case student_id is
// generated from sequence
PreparedStatement ps = connection.prepareStatement(QUERY,
        new String[] { "student_id" });

// local variable to hold auto generated student id
Long studentId = null;

// execute the insert statement, if success get the primary key value
if (ps.executeUpdate() > 0) {

    // getGeneratedKeys() returns result set of keys that were auto
    // generated
    // in our case student_id column
    ResultSet generatedKeys = ps.getGeneratedKeys();

    // if resultset has data, get the primary key value
    // of last inserted record
    if (null != generatedKeys && generatedKeys.next()) {

        // voila! we got student id which was generated from sequence
        studentId = generatedKeys.getLong(1);
    }

}
于 2014-11-06T17:14:37.030 に答える