Есть ли способ получить идентификатор автоинкремента из подготовленного оператора
Есть ли способ получить автоматически сгенерированный ключ из запроса БД при использовании Java-запроса с подготовленными операторами.
Например, я знаю, что AutoGeneratedKeys может работать следующим образом.
stmt = conn.createStatement();
stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
Однако. Что делать, если я хочу сделать вкладку с подготовленным Заявление.
String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql);
//this is an error
stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
//this is an error since the above is an error
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
Есть ли способ сделать это, о котором я не знаю. Кажется, из javadoc, что PreparedStatements не может вернуть Auto Generated ID.
Ответы
Ответ 1
Да. См. здесь. Раздел 7.1.9. Измените свой код на:
String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
stmt.executeUpdate();
if(returnLastInsertId) {
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
auto_id = rs.getInt(1);
}
Ответ 2
Есть несколько способов, и, кажется, разные драйверы jdbc обрабатывают вещи немного иначе или вообще не в некоторых случаях (некоторые из них будут давать только автоматически генерируемые первичные ключи, а не другие столбцы), но основные формы
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
Или используйте эту форму:
String autogenColumns[] = {"column1","column2"};
stmt = conn.prepareStatement(sql, autogenColumns)
Ответ 3
Да, есть способ. Я просто нашел это скрытие в java-документе.
Они должны передать идентификатор AutoGeneratedKeys следующим образом
String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
Ответ 4
Я один из тех, кто просматривал несколько потоков, ища решение этой проблемы... и, наконец, заработал. ДЛЯ ТЕХ ИСПОЛЬЗОВАНИЯ jdbc: oracle: thin: with ojdbc6.jar ПОЖАЛУЙСТА, ПРИНИМАЙТЕ ПРИМЕЧАНИЕ:
Вы можете использовать оба метода:
(Метод 1)
Try{
String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)";
myPrepStatement = <Connection>.prepareStatement(yourSQL, Statement.RETURN_GENERATED_KEYS);
myPrepStatement.setInt(1, 123);
myPrepStatement.setInt(2, 123);
myPrepStatement.executeUpdate();
ResultSet rs = getGeneratedKeys;
if(rs.next()) {
java.sql.RowId rid=rs.getRowId(1);
//what you get is only a RowId ref, try make use of it anyway U could think of
System.out.println(rid);
}
} catch (SQLException e) {
//
}
(метод 2)
Try{
String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)";
//IMPORTANT: here where other threads don tell U, you need to list ALL cols
//mentioned in your query in the array
myPrepStatement = <Connection>.prepareStatement(yourSQL, new String[]{"Id","Col2","Col3"});
myPrepStatement.setInt(1, 123);
myPrepStatement.setInt(2, 123);
myPrepStatement.executeUpdate();
ResultSet rs = getGeneratedKeys;
if(rs.next()) {
//In this exp, the autoKey val is in 1st col
int id=rs.getLong(1);
//now this a real value of col Id
System.out.println(id);
}
} catch (SQLException e) {
//
}
В принципе, попробуйте не использовать Method1, если вам просто нужно значение SEQ.Nextval, b'cse просто вернет RowID ref, чтобы вы могли взломать ваш поиск в голове, чтобы использовать его, что также не подходит для всех типов данных вы попробовали кастинг! Это может работать нормально (return actual val) в MySQL, DB2, но не в Oracle.
И, отключите ваш SQL Developer, Toad или любой клиент, который использует тот же сеанс входа в INSERT, когда вы отлаживаете. Он МОЖЕТ не влиять на вас каждый раз (отладочный вызов)... пока вы не обнаружите, что ваши приложения замораживаются без каких-либо исключений в течение некоторого времени. Да... без исключения!
Ответ 5
Connection connection=null;
int generatedkey=0;
PreparedStatement pstmt=connection.prepareStatement("Your insert query");
ResultSet rs=pstmt.getGeneratedKeys();
if (rs.next()) {
generatedkey=rs.getInt(1);
System.out.println("Auto Generated Primary Key " + generatedkey);
}