executeUpdateAndGetGeneratedKeys方法使用Statement.RETURN_GENERATED_KEYS标志向驱动程序发出信号,表明应该返回自动生成的密钥。但是,来自Oracle 文档:
如果未明确指出关键列,则 Oracle JDBC 驱动程序无法识别需要检索哪些列。当使用列名或列索引数组时,Oracle JDBC 驱动程序可以识别哪些列包含您要检索的自动生成的键。但是,当使用Statement.RETURN_GENERATED_KEYS
整数标志时,Oracle JDBC 驱动程序无法识别这些列。当整数标志用于指示要返回自动生成的键时,ROWID
伪列作为键返回。然后ROWID
可以从 ResultSet 对象中获取 ,并可用于检索其他列。
因此,请尝试使用他们将列名数组传递给的建议prepareStatement
:
var dbConn;
try {
dbConn = DatabaseConnectionFactory.createDatabaseConnection('oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:@localhost:1521:DBNAME','user','pass');
// Create a Java String array directly
var keyColumns = java.lang.reflect.Array.newInstance(java.lang.String, 1);
keyColumns[0] = 'id';
var ps = dbConn.getConnection().prepareStatement('INSERT INTO tablename (columnname) VALUES (?)', keyColumns);
try {
// Set variables here
ps.setObject(1, 'test');
ps.executeUpdate();
var result = ps.getGeneratedKeys();
result.next();
var generatedKey = result.getObject(1);
logger.info(generatedKey);
} finally {
ps.close();
}
} finally {
if (dbConn) {
dbConn.close();
}
}