Beaucoup de SGBD proposent des requêtes plutôt simples pour réaliser ce qu’on appelle couramment des upserts (ou encore « insert-or-update« ). Cela permet donc d’effectuer une mise à jour si l’insertion échoue. Dans DB2/400, il faut utiliser une requête “MERGE INTO”.
La documentation d’IBM, en plus de détailler chaque clause, propose également des exemples concrets. Le principe est simple. La requête se base sur une condition de recherche. Il faut alors prévoir le cas où la recherche a abouti et le cas contraire.
Syntaxe
Exemple
MERGE INTO FPRXML p
USING TABLE(
VALUES(
CAST (? AS CHAR(13)),
CAST (? AS INTEGER)
)
) s(FEAN13, FCASKU)
ON (p.FEAN13 = s.FEAN13
AND P.FCASKU = s.FCASKU)
WHEN NOT MATCHED THEN INSERT (FCACAR, FCASKU, FEAN13)
VALUES (?, ?, ?)
WHEN MATCHED THEN UPDATE SET FPXFNC = ?
Comme on le voit dans l’exemple ci-dessus, la condition de recherche peut être simplement un ensemble de valeurs, qui constituent alors une table. Une jointure est alors effectuée sur la table dans laquelle on veut faire les mises à jour (p.x = s.x). Notez que l’on peut aussi utiliser directement une table (ex : USING matable) ou bien une requête de sélection.