Java : INSERT + SELECT en une instruction

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 SEQUENCE
  • MT_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.