30 avril 2021

Exemple d'ordre SQL MERGE permettant de gérer soit un INSERT soit un UPDATE

Dans l'exemple suivant on a inséré une occurrence dans ZD05 d'un code de DRE. On corrige ensuite la ZDTD12 par un MERGE pour que l'occurrence soit créée (si nouvelle) ou modifiée (si existante).

Il s'agit d'une syntaxe SQL ou l'on va :

  • Présenter la table ciblée (MERGE INTO ... A)
  • Produire un SELECT indiquant les valeurs par défaut (USING ... B)
  • Indiquer le critère de mise en correspondance des listes A et B (ON A...=B...)
  • Indiquer quoi faire en cas de correspondance (WHEN MATCHED THEN UPDATE ...) 
  • Ou en cas de non correspondance (WHEN NOT MATCHED THEN INSERT...)


MERGE INTO ZDTD12 A
USING (SELECT NUDOSS, .... AS PGPDOS,'05' AS CDINFO,'0' AS TEVERO,1 AS NOMBRE,0 AS NULMAX,0 AS NUCMAX,
       '        ' AS TECPRT,SYSDATE AS TIMJIF FROM ZD00 WHERE CDSTCO = 'DRE') B
ON (A.NUDOSS=B.NUDOSS AND A.CDINFO=B.CDINFO)
WHEN MATCHED THEN UPDATE SET A.NOMBRE=B.NOMBRE, A.NULMAX=B.NULMAX
WHEN NOT MATCHED THEN INSERT (NUDOSS, PGPDOS, CDINFO, NOMBRE, TEVERO, NULMAX, NUCMAX, TECPRT, TIMJIF)
       VALUES (B.NUDOSS, B.PGPDOS, B.CDINFO, B.NOMBRE, B.TEVERO, B.NULMAX, B.NUCMAX, B.TECPRT, B.TIMJIF);
COMMIT;