Vous voulez mettre à jour des informations dans une table sans faire de boucle de lecture ? Cet article est pour vous.
Prenons un exemple. Vous consommez un service web qui vous transmet une liste d’article que vous devez stocker en base de données.
L’ordre DB2 MERGE vous permettra d’ajouter les articles qui n’existent pas et de mettre à jour ceux qui existent.
Création de table ARTICLE
CREATE TABLE ARTICLE (
CDART CHAR(10) CCSID 1147 DEFAULT ' ' ,
DESART CHAR(30) CCSID 1147 DEFAULT ' ' )
RCDFMT ARTICLE ;
LABEL ON TABLE ARTICLE
IS 'Base article' ;
LABEL ON COLUMN ARTICLE
( CDART IS 'Code article ' ,
DESART IS 'Désignation article ' ) ;
Code RPG avec ajout ou mise à jour d’un article.
ctl-opt alwnull(*usrctl) option(*nodebugio:*srcstmt);
//Variables
dcl-s code_article char(10);
dcl-s designation_article char(30);
exec sql SET OPTION commit = *none;
code_article = 'AB123456';
designation_article = 'Ma désignation';
Exec Sql
MERGE INTO ARTICLE as ARTICLE
USING(VALUES (:code_article, :designation_article))
AS SOURCE(CDART,DESART)
ON ARTICLE.CDART = SOURCE.CDART
-- Mise à jour de la désignation si code article trouvé
WHEN MATCHED THEN UPDATE
SET DESART = SOURCE.DESART
-- Ajout de l'article
WHEN NOT MATCHED THEN INSERT VALUES (SOURCE.CDART,
SOURCE.DESART)
NOT ATOMIC CONTINUE ON SQLEXCEPTION;
*inLR=*ON;
Vous pouvez également supprimer l’article s’il est trouvé.
WHEN MATCHED THEN DELETE
On peut rajouter des conditions en plus du MATCHED. Dans la ligne ci-dessous je ne veux mettre à jour que l’article ‘TEST’. Pas grand intérêt mais c’était pour montrer un exemple.
WHEN MATCHED AND CDART='TEST' THEN UPDATE SET DESART = SOURCE.DESART
Vous pouvez aussi tester la valeur pour la contrôler avant de faire la mise à jour.
WHEN MATCHED AND SOURCE.DESART IS NOT NULL THEN UPDATE SET DESART = SOURCE.DESART
Il est également possible de prendre le résultat d’un select au lieu des deux variables
MERGE INTO ARTICLE as ARTICLE
USING(VALUES (SELECT CDART, DESART FROM ARTICLE2))
AS SOURCE(CDART,DESART)
ON ARTICLE.CDART = SOURCE.CDART
-- Mise à jour de la désignation si code article trouvé
WHEN MATCHED THEN UPDATE
SET DESART = SOURCE.DESART
-- Ajout de l'article
WHEN NOT MATCHED THEN INSERT VALUES (SOURCE.CDART,
SOURCE.DESART)
NOT ATOMIC CONTINUE ON SQLEXCEPTION;
Je ne l’ai pas dit au début de l’article mais ça fonctionne aussi sur les PF.