executeUpdateAndGetGeneratedKeys方法使用Statement.RETURN_GENERATED_KEYS标志向驱动程序发信号通知应该返回自动生成的密钥。但是,从Oracle docs:
如果未明确指示键列,则Oracle JDBC驱动程序无法识别需要检索哪些列。当使用列名称或列索引数组时,Oracle JDBC驱动程序可以识别哪些列包含要检索的自动生成的键。但是,使用Statement.RETURN_GENERATED_KEYS
整数标志时,Oracle JDBC驱动程序无法识别这些列。当使用整数标志指示要返回自动生成的密钥时,伪列将作为关键字返回。 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();
}
}
谢谢你,尼克 - 感谢代码太 - 我也看到的getGeneratedKeys有时可能会引发不支持的动作(或类似的东西)异常。 –