2012-04-23 6 views
2

Oracleのシーケンスを使用してjdbcの2つのテーブルにログIDを挿入しますか?私は次のようにtableAにログIDを挿入するための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(); 

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

答えて

7

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

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

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

代わりに、ローカル変数にシーケンス値を取得し、第二INSERT文でそれを使用するために、あなたの最初の文でRETURNING句を使用することができます。しかし、これはおそらく単にcurrvalを使用するよりも多くの作業です。

+1

+1 'logid_seq.currval'が行く方法です。 –

0
String QUERY = "INSERT INTO students "+ 
       " VALUES (student_seq.NEXTVAL,"+ 
       "   'Harry', '[email protected]', '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); 
    } 

} 
+0

http://stackoverflow.com/questions/30394077/oracle-awr-high-sql-parse-calls-but-0-executions/42384485#42384485 - この解決策に問題があります – Atmega

関連する問題