Search code examples
javasqloracle-databaseprepared-statementauto-increment

Unable to find a generated key in Java using PreparedStatement's getGeneratedKeys()


I have a query as follows:

String SQL = "insert into table (id, name) values (sequence.nextval, ?)";

I then make a PreparedStatement like this:

//initiate connection, statement etc
pStatement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
pStatement.setString(1,'blabla');

pStatement.executeUpdate();
ResultSet rs = pStatement.getGeneratedKeys();

while (rs.next()){
  //debugging here to see what rs has
}

When executing and debugging at that debug point, I see my ResultSet only has one key, a string - not like the id I expect at all. When checking the database everything works fine, the id's get inserted and everything. There's something about the getGeneratedKeys(); that's confusing me.

What am I doing wrong?

Thanks in advance


Solution

  • I expect that the "key" you're getting back that looks like a string is the ROWID-- that's the only key that the database is directly generating. You should be able to change that to get your id column back (this probably requires a moderately recent version of the JDBC driver).

    //initiate connection, statement etc
    String generatedColumns[] = {"ID"};
    pStatement = connection.prepareStatement(SQL, generatedColumns);
    pStatement.setString(1,'blabla');
    
    pStatement.executeUpdate();
    ResultSet rs = pStatement.getGeneratedKeys();
    
    while (rs.next()){
      //debugging here to see what rs has
    }
    

    You could also change your query to explicitly add the RETURNING clause

    String SQL = "insert into table (id, name) " + 
                 "  values (sequence.nextval, ?) " + 
                 "  returning id into ?";