2017-10-18 7 views
2

J'ai créé une nouvelle table VISNHDR avec les champs suivants (ce n'est pas la table entière mais c'est suffisant pour ma question):AS400 - Utiliser Merge pour ajouter un nouvel enregistrement à une table et éviter une erreur de doublon

- ORDNO (VARCHAR 7) - KEY 
- ORDDT (NUMERIC 7,0) - KEY 
- ORDTM (NUMERIC 6,0) - KEY 
- CRTDT (NUMERIC 7,0) 
- CRTTM (NUMERIC 6,0) 

Je suis en train de INSERT un nouveau record à cette table et je suis en train d'empêcher son insertion dans le cas d'un duplicate key. Je préfère le faire dans une requête au lieu d'avoir une requête pour vérifier si la duplication existe et une autre pour insérer l'enregistrement. Selon mes recherches sur le net, j'ai essayé d'utiliser MERGE mais sans succès.

MERGE INTO visnhdr v1 USING (SELECT 
    ordno, 
    orddt, 
    ordtm 
    FROM 
    visnhdr 
    WHERE 
    ordno = 'M12345' 
    AND orddt = 1170101 
    AND ordtm = 101010 
) AS V2(ordno,orddt,ordtm) 
ON (
    v1.ordno = v2.ordno 
    AND v1.orddt = v2.orddt 
    AND v1.ordtm = v2.ordtm 
) 
WHEN NOT MATCHED THEN INSERT (
    ordno, 
    orddt, 
    ordtm, 
    crtdt, 
    crttm 
) VALUES (
    v2.ordno, 
    v2.orddt, 
    v2.ordtm, 
    1170102, 
    101011 
); 

Je reçois une erreur:

Row not found for MERGE.

Quelle est la syntaxe correcte pour obtenir mon problème?

+1

Je n'ai pas de requête corrigée pour vous, mais le problème est que vous essayez d'utiliser les résultats de votre table v2, quand il n'y a pas de résultats dans cette table. Fondamentalement comme écrit, vous avez "Rechercher l'enregistrement X. Si l'enregistrement X n'existe pas, utilisez le contenu de l'enregistrement X pour créer l'enregistrement X." Je soupçonne que dans votre section Valeurs non-appariées, vous avez besoin des paramètres que vous allez transmettre à la place des entrées V2.Field. – Hellion

+0

@Hellion, merci cela m'aide à comprendre le problème – ehh

Répondre

1

Je trouve la syntaxe correcte:

MERGE INTO VISNHDR V1 USING (
     VALUES ('M12345', 1170101, 101011, 1170103, 101012)) V2 (ORDNO, ORDDT, ORDTM, CRDDT, CRTTM) 
     ON V1.ORDNO = V2.ORDNO AND V1.ORDDT = V2.ORDDT AND V1.ORDTM = V2.ORDTM 
WHEN NOT MATCHED THEN 
     INSERT VALUES(V2.ORDNO, V2.ORDDT, V2.ORDTM, V2.CRDDT, V2.CRTTM) 

Commentaire:

Selon la façon dont vous avez défini vos colonnes, vous pouvez obtenir une erreur en disant:

one or more of the columns omited from the column list was created as not null.

C'est l'erreur que j'ai eu et j'avais besoin d'ajouter les autres champs que j'ai dans ma table dans la requête. Et cela n'a rien à voir avec le problème de syntaxe auquel je faisais face dans ce post.