J’ai récemment eu besoin, dans un programme Java, d’insérer un enregistrement en base de données puis de récupérer la clé primaire générée par une SEQUENCE afin d’effectuer d’autres traitements.
La clé primaire étant un ID généré par la SEQUENCE Oracle (dans un trigger), je ne pouvais accéder à cet ID qu’en effectuant une requête SELECT supplémentaire. Cette solution pose des problèmes lorsque plusieurs lignes sont renvoyées par l’ordre select.
A travers cet article, je vous propose une solution qui vous assurera de récupérer la bonne valeur. Nous allons donc utiliser la fonctionnalité RETURNING
lors de l’insertion, cela nous permettra d’attraper l’ID à la volée.
La table : MY_TABLE
MT_ID
: La clé primaire générée par la SEQUENCEMT_LABEL
: VARCHAR2(255)MT_VALUE
: VARCHAR2(255)
La requête
String sqlInsertMT = " BEGIN INSERT INTO my_table (mt_label, mt_value) VALUES (?, ?) RETURNING mt_id INTO ?; END; ";
L’appel
CallableStatement pCallInsertMT = connection.prepareCall(sqlInsertMT); pCallInsertMT.setString(1, "Un libelé"); pCallInsertMT.setString(2, "Une valeur"); pCallInsertMT.registerOutParameter(3, java.sql.Types.VARCHAR); pCallInsertMT.executeUpdate();
La récupération de l’ID
// On recupere l'id genere int mtId = pCallInsertMT.getInt(3);
Conclusion
Le tour est joué, vous pouvez maintenant récupérer n’importe quel champ généré à l’insertion par la base de données.