Recherche sur le blog

mercredi 3 juillet 2013

[SQL] Réaliser des “upserts” sur DB2/400

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.

Aucun commentaire: