Я использую последовательность oracle для вставки идентификатора журнала в таблицу A следующим образом:
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);
}
И добавив его в таблицуB,
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();
Есть ли способ генерации последовательности в Java вместо Oracle и вставки в обе таблицы сразу, вместо того, чтобы выбирать из tableA и вставлять в tableB?
В общем случае выбор MAX(log_id)
не даст вам того же значения, что и logid_seq.nextval
. Предполагая, что это многопользовательская система, какой-то другой пользователь мог бы вставить еще одну строку с большим значением log_id
, чем строка, которую вы только что вставили, прежде чем ваш запрос будет выполнен.
Предполагая, что оба оператора INSERT
выполняются в одном сеансе, самым простым вариантом является, вероятно, использование logid_seq.currval
во втором выражении INSERT
. currval
вернет последнее значение последовательности, которая была возвращена текущему сеансу, поэтому всегда будет возвращать то же значение, которое было вызвано вызовом nextval
в первом утверждении.
INSERT INTO tableB (LOG_ID, RESPONSE_CODE, RESPONSE_MSG)
VALUES( logid_seq.currval, ?, ? )
В качестве альтернативы вы можете использовать предложение RETURNING
в своем первом утверждении для извлечения значения последовательности в локальную переменную и использовать ее во втором выражении INSERT
. Но это, вероятно, больше, чем просто использование currval
.
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);
}
}
logid_seq.currval
это путь.