La méthode executeUpdateAndGetGeneratedKeys utilise l'indicateur Statement.RETURN_GENERATED_KEYS pour signaler au pilote que les clés générées automatiquement doivent être renvoyées. Cependant, à partir du Oracle docs:
Si des colonnes clés ne sont pas explicitement indiqué, alors les pilotes JDBC d'Oracle ne peuvent pas identifier les colonnes doivent être récupérées. Lorsqu'un nom de colonne ou un tableau d'index de colonnes est utilisé, les pilotes Oracle JDBC peuvent identifier les colonnes contenant les clés générées automatiquement que vous souhaitez récupérer. Toutefois, lorsque l'indicateur d'entier Statement.RETURN_GENERATED_KEYS
est utilisé, les pilotes Oracle JDBC ne peuvent pas identifier ces colonnes. Lorsque l'indicateur d'entier est utilisé pour indiquer que les clés générées automatiquement doivent être renvoyées, la pseudo colonne ROWID
est renvoyée en tant que clé. Le ROWID
peut ensuite être récupéré à partir de l'objet ResultSet et peut être utilisé pour extraire d'autres colonnes.
Ainsi, au lieu, essayez d'utiliser leur suggestion de passer dans un tableau de nom de colonne 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();
}
}
Merci, Nick - merci pour le code aussi - je l'ai vu aussi que getGeneratedKeys peut parfois jeter l'action non pris en charge (ou quelque chose comme ça) exception. –