2016-05-05 2 views
1

Я пытаюсь получить автоматически сгенерированный идентификатор после вставки с помощью ojdbc.Как получить сгенерированный идентификатор с OJDBC?

Мой код выглядит так:

public void insert(Connection con) throws SQLException { 
    String query = "INSERT INTO MY_TABLE (ID, FIELD1, FIELD2, FIELD3, FIELD4, FIELD5, FIELD6, FIELD7, FIELD8) VALUES (SEQ_MY_TABLE_ID.NEXTVAL, ?, ?, ?, ?, ?, ?, ?, ?)"; 
    PreparedStatement stmt = null; 
    try { 
     stmt = con.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS); 
     stmt.setBigDecimal(1, null == field1 ? null : new BigDecimal(field1)); 
     stmt.setBigDecimal(2, null == field2 ? null : new BigDecimal(field2)); 
     stmt.setBigDecimal(3, field3); 
     stmt.setString(4, field4); 
     stmt.setBigDecimal(5, field5); 
     stmt.setBigDecimal(6, null == field6 ? null : new BigDecimal(field6)); 
     stmt.setBigDecimal(7, null == field7 ? null : new BigDecimal(field7)); 
     stmt.setString(8, field8); 
     stmt.executeUpdate(); 
     ResultSet idResults = stmt.getGeneratedKeys(); 
     if(null != idResults && idResults.next()){ 
      id = null == idResults.getBigDecimal(ID_COLUMN_NAME) ? null : idResults .getBigDecimal(ID_COLUMN_NAME).toBigInteger(); 
      //do something with the id we get back from the database 
     } 
    } finally { 
     cleanupConnection(con, stmt, null); 
    } 
} 

Я получаю java.lang.ArrayIndexOutOfBoundException: 8

ответ

0

Попробуйте изменить PreparedStatement, как показано ниже. Я думаю, вам нужно перечислить все столбцы в массиве и передать его в качестве аргумента для prepareStatement. Это может привести к исключению ArrayIndexOutOfBoundException.

stmt = con.prepareStatement(query, new String[] {"ID","FIELD1","FIELD2","FIELD3","FIELD4","FIELD5","FIELD6","FIELD7","FIELD8"}); 
0

1) Опция. stmt = con.prepareStatement(query, String[]{ID_COLUMN_NAME});

2) Вариант Должен работать, но я не тестировал его. getReturnResultSet() - возвращает набор результатов, содержащий данные, возвращаемые с возврата DML.

public void insert(Connection con) throws SQLException { 
    String query = "INSERT INTO MY_TABLE (ID, FIELD1, FIELD2, FIELD3, FIELD4, FIELD5, FIELD6, FIELD7, FIELD8) VALUES (SEQ_MY_TABLE_ID.NEXTVAL, ?, ?, ?, ?, ?, ?, ?, ?) returning ID into ?  "; 
    PreparedStatement stmt = null; 
    try { 
     stmt = con.prepareStatement(query); 
     stmt.setBigDecimal(1, null == field1 ? null : new BigDecimal(field1)); 
     stmt.setBigDecimal(2, null == field2 ? null : new BigDecimal(field2)); 
     stmt.setBigDecimal(3, field3); 
     stmt.setString(4, field4); 
     stmt.setBigDecimal(5, field5); 
     stmt.setBigDecimal(6, null == field6 ? null : new BigDecimal(field6)); 
     stmt.setBigDecimal(7, null == field7 ? null : new BigDecimal(field7)); 
     stmt.setString(8, field8); 
     stmt.registerReturnParameter(9, OracleTypes.INTEGER); 
     stmt.executeUpdate(); 
     ResultSet idResults = ((OraclePreparedStatement stmt).getReturnResultSet(); 
     if(null != idResults && idResults.next()){ 
      id = idResults.getInt(9); 
     } 
    } finally { 
     cleanupConnection(con, stmt, null); 
    } 
} 
Смежные вопросы