Подтвердить что ты не робот

Есть ли способ получить идентификатор автоинкремента из подготовленного оператора

Есть ли способ получить автоматически сгенерированный ключ из запроса БД при использовании 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.

4b9b3361

Ответ 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); 
    }