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有時可能會引發不支持的動作(或類似的東西)異常。 –