使用PreparedStatement的getGeneratedKeys()无法在Java中找到生成的密钥

arn*_*ehe 6 java sql oracle prepared-statement auto-increment

我有一个查询如下:

String SQL = "insert into table (id, name) values (sequence.nextval, ?)";
Run Code Online (Sandbox Code Playgroud)

然后我像这样制作一个PreparedStatement:

//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
}
Run Code Online (Sandbox Code Playgroud)

在该调试点执行和调试时,我看到我的ResultSet只有一个键,一个字符串 - 不像我期望的id.检查数据库时一切正常,id插入和一切.getGeneratedKeys()有一些东西; 那令我困惑.

我究竟做错了什么?

提前致谢

Jus*_*ave 10

我希望你回来的那个看起来像字符串的"密钥"是ROWID- 这是数据库直接生成的唯一密钥.您应该能够更改它以使id列恢复(这可能需要适度的最新版本的JDBC驱动程序).

//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
}
Run Code Online (Sandbox Code Playgroud)

您还可以更改查询以显式添加RETURNING子句

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