MERGE (SQL)

MERGE INTO table-name [[AS] correlation-name]
  [include-columns] USING source-table
  ON search-condition

[WHEN MATCHED THEN update-operation]
[WHEN NOT MATCHED THEN insert-operation]

  [NOT ATOMIC CONTINUE ON SQLEXCEPTION]
  [QUERYNO integer]

Dieses Dokument behandelt folgende Themen:

Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.

Gehört zur Funktionsgruppe: Datenbankzugriffe und Datenbankänderungen

Siehe auch MERGE - SQL im Teil Natural for Db2 in der Datenbankmanagementsystem-Schnittstellen-Dokumentation.


Funktion

Das MERGE-Statement aktualisiert eine Tabelle mit den angebenen Eingabedaten. Diejenigen Zeilen in der Zieltabelle, die zu den Eingabedaten passen, werden gemäß den Angaben aktualisiert, und Zeilen, welche in der Zieltabelle nicht vorhanden sind, werden eingefügt.

Das MERGE-Statement gehört zum SQL Extended Set.

Einschränkung

Dieses Statement steht nur bei Natural for Db2 zur Verfügung.

Syntax-Beschreibung

Syntax-Element Beschreibung
MERGE INTO
MERGE INTO-Klausel:

MERGE INTO initiiert ein SQL MERGE-Statement, welches eine Kombination aus einem SQL INSERT- und einem SQL Searched UPDATE-Statement ist.

table-name
Tabellenname:

Kennzeichnet das Ziel der INSERT- oder UPDATE-Operation des MERGE-Statement.

Siehe table-name specification.

[AS] correlation-name
[AS] correlation-name-Klausel:

Gibt einen alternativen Namen für die Zieltabelle an. Der alternative Name kann bei der Referenzierung von Spalten der Zwischenergebnistabelle als Qualifizierungsmerkmal dienen.

include-columns
Include Columns-Klausel:

Gibt einen Satz von Spalten an, die gemeinsam mit den Spalten der Zieltabelle in die Ergebnistabelle des MERGE-Statement eingebunden werden, wenn dieses in der FROM-Klausel eines SELECT-Statement verschachtelt ist. Die eingebundenen Spalten werden an das Ende der durch die Zieltabelle festgelegten Spaltenliste angehängt.

Weitere Informationen siehe include-columns.

USING source-table
USING source-table-Klausel:

Gibt die Werte für die in der Zieltabelle zusammenzuführenden Zeilendaten an.

Siehe source-table

ON search-condition
ON search-condition-Klausel:

Gibt Bedingungen für eine Zusammenführung (Join) zwischen Quellentabelle (source-table) und Zieltabelle an. Jeder Spaltenname in der Suchbedingung muss eine Spalte der Zieltabelle oder Quellentabelle benennen.

WHEN MATCHED THEN update-operation
WHEN MATCHED THEN update-operation-Klausel:

Gibt an, welche Aktualisierungsoperation durchgeführt werden soll, wenn die Suchbedingung (search-condition) wahr ist.

Siehe Anmerkung weiter unten.

WHEN NOT MATCHED THEN insert-operation
WHEN NOT MATCHED THEN insert-operation-Klausel:

Gibt an, welche Einfügeoperation (insert-operation) durchgeführt werden soll, wenn die Suchbedingung (search-condition) wahr ist.

Siehe Anmerkung weiter unten.

NOT ATOMIC CONTINUE ON SQLEXCEPTION
NOT ATOMIC CONTINUE ON SQLEXCEPTION-Klausel:

Gibt an, ob die Zusammenführungsverarbeitung fortgesetzt werden soll, falls während der Verarbeitung einer Zeile eines Satzes von Quellenzeilen ein Fehler aufgetreten ist.

QUERYNO integer
QUERYNO integer-Klausel:

Gibt die Nummer für das SQL-Statement an, welches bei der EXPLAIN-Ausgabe und in den Db2 Trace-Aufzeichnungen verwendet wird.

Anmerkung:
Es muss zumindest die WHEN MATCHED THEN update-operation-Klausel oder die WHEN NOT MATCHED THEN insert-operation-Klausel angegeben werden.

source-table

(VALUES

values-single-row
values-multiple-row

)
  [AS] correlation-name (column-name,...)
Syntax-Element Beschreibung
VALUES Mit dem Schlüsselwort VALUES wird die Angabe von Werten für die in die Zieltabelle einzufügenden Zeilendaten eingeleitet.
values-single-row Gibt eine einzelne Quellentabellendatenzeile an. Siehe values-single-row.
values-multiple-row Gibt mehrere Quellentabellendatenzeilen an. Siehe values-multiple-row.
[AS] correlation-name Gibt einen Korrelationsnamen für die Quellentabelle an.
column-name Gibt einen Spaltennamen an, um die Eingabedaten mit der UPDATE SET assignment-clause für eine Aktualisierungsoperation oder mit der VALUES-Klausel für eine Einfügeoperation zu verbinden.

values-single-row

 

expression
NULL

 

(

expression
NULL

,...)
Syntax-Element Beschreibung
expression
Skalar-Ausdruck:

Gibt einen Skalar-Ausdruck an. Siehe Skalar-Ausdrücke.

NULL
NULL-Wert:

Gibt den NULL-Wert an.

values-multiple-row

 

expression
host-variable-array
NULL

 

FOR

host-variable
integer-constant

ROWS
(

expression
host-variable-array
NULL

,...)
Syntax-Element Beschreibung
expression
Skalar-Ausdruck:

Gibt einen Skalar-Ausdruck an. Siehe Skalar-Ausdrücke.

host-variable-array
Host-Variablen-Array:

Gibt ein Benutzervariablen-Array oder einen Indexbereich eines Array an. Wenn ein host-variable-array angegeben wird, muss die Compiler-Option DB2ARRY auf ON gesetzt werden. Mit dem Schlüsselwort INDICATOR kann ein optionales Indikator-Array angegeben werden:

host-variable-array INDICATOR [:]indicator-arry.

NULL
NULL-Wert:

Gibt den NULL-Wert an.

FOR ... ROWS
Anzahl der zusammenzuführenden Zeilen:

Diese Klausel gibt die Anzahl der zusammenzuführenden Zeilen an. host-variable oder integer-constant wird ein Wert k zugewiesen. k muss im Bereich von 0 bis 32767 liegen und muss kleiner als die oder gleich der Minimalgröße aller angegebenen Benutzervariablen-Arrays sein.

update-operation

UPDATE SET assignment-clause
Syntax-Element Beschreibung
UPDATE SET Gibt an, welche Aktualisierungsoperation ausgeführt werden soll, wenn die Auswertung ergibt, dass die Suchbedingung (search-condition) wahr ist.

Siehe assignment-clause weiter unten.

assignment-clause

column-name =

expression

 

,...
DEFAULT
NULL
(column-name,...) = (

expression

,...)
DEFAULT
NULL
Syntax-Element Beschreibung
column-name Gibt den Namen der Spalte an, für die ein Einfügewert vorgesehen ist.
expression Gibt den neuen Wert für die Spalte an. Ein Ausdruck (expression) kann Referenzen auf Spalten der Quellentabelle (source-table) oder der Zieltabelle enthalten. expression kann keine Referenzen auf enthaltene Spalten enthalten.
DEFAULT Gibt den Standardwert DEFAULT für die Spalte an. Der Wert, welcher zugewiesen wird, hängt davon ab, wie die Spalte definiert ist.
NULL Gibt den Wert NULL als neuen Wert für die Spalte an.

insert-operation

INSERT [(column-name,...)] VALUES (

expression
DEFAULT)
NULL

,...)
Syntax-Element Beschreibung
INSERT Gibt die Einfügeoperation an, die ausgeführt werden soll, wenn die Suchbedingung (search-condition) nicht wahr ist.
column-name Gibt die Spalte, für die ein Einfügewert vorgesehen ist.
VALUES Mit diesem Schlüsselwort werden ein oder mehrere einzufügende Spaltenwerte eingeleitet.
expression Gibt den neuen Wert für die Spalte an.

Ein Ausdruck (expression) kann Referenzen auf Spalten der Quellentabelle enthalten. expression kann keine Referenzen auf Spalten der Zieltabelle enthalten.

DEFAULT Gibt den Standardwert DEFAULT für die Spalte an.

Der Wert, welcher zugewiesen wird, hängt davon ab, wie die Spalte definiert ist.

NULL Gibt den Wert NULL als neuen Wert für die Spalte an.

Beispiele

Beispiel 1:

Aktualisieren der Bestandsliste eines Kfz-Vertragshändlers. Hinzufügen eines neuen Fahrzeugmodells zur Bestandsliste bzw. Aktualisieren der Informationen über vorhandes Fahrzeugmodell, welches schon in der Bestandsliste existiert.

DEFINE DATA LOCAL            
01 #MODEL (A20)           
01 #DELTA (I4)         
END-DEFINE  
* Setup input host variables
ASSIGN #MODEL = ‘Grand Turbo’
ASSIGN #DELTA := 5
* Insert/Update into INVENTORY table
MERGE INTO CDS-INVENTORY T
  USING (VALUES (:#MODEL, :#DELTA)) AS S(MODEL, DELTA)
  ON T.MODEL = S.MODEL
WHEN MATCHED THEN UPDATE SET T.QUANTITY = T.QUANTITY + S.DELTA 
WHEN NOT MATCHED THEN INSERT VALUES (S.MODEL, S.DELTA)
END TRANSACTION   
END

Beispiel 2:

Aktualisieren der Bestandsliste eines Kfz-Vertragshändlers. Hinzufügen neuer Fahrzeugmodelle zur Bestandsliste und Aktualisieren der Informationen über vorhande Fahrzeugmodelle, welche schon in der Bestandsliste existieren. Die Eingabe kommt aus Natural-Arrays. Der spezifische Code der Arrays ist in Fettdruck dargestellt.

OPTIONS DB2ARRY ON
DEFINE DATA LOCAL            
01 #MODEL_ARR (A20/1:20)           
01 #DELTA_ARR (I4/1:20))
01 #ROW-COUNT (I4)
01 #NUM-ERRORS (I4)
01 #SQLCODE    (I4)
01 #SQLSTATE   (A5)
01 #ROW-NUM    (I4)           
END-DEFINE  
* Setup input host variables
ASSIGN #MODEL_ARR(1) = ‘Grand Turbo’
ASSIGN #DELTA_ARR(1) := 5
ASSIGN #MODEL_ARR(2) = ‘Blue Car’
ASSIGN #DELTA_ARR(2) := 3
. . .
* Insert/Update into INVENTORY table
CALLNAT 'NDBNOERR' 
MERGE INTO CDS-INVENTORY T
  USING (VALUES (:#MODEL_ARR(*), :#DELTA_ARR(*))
  FOR 20 ROWS) 
  AS S(MODEL, DELTA)
ON T.MODEL = S.MODEL
WHEN MATCHED THEN UPDATE SET T.QUANTITY = T.QUANTITY + S.DELTA 
WHEN NOT MATCHED THEN INSERT VALUES (S.MODEL, S.DELTA)
NOT ATOMIC CONTINUE ON SQLEXCEPTION
* Check outcome of MERGE
PROCESS SQL SYSIBM-SYSDUMMY1                              
  <<GET DIAGNOSTICS                                       
  :#ROW-COUNT  = ROW_COUNT                                
  ,:#NUM-ERRORS = NUMBER>>                                
WRITE 'Number of rows merged             :' #ROW-COUNT /
      'NUMBER OF ERRORS                  :' #NUM-ERRORS 
IF #NUM-ERRORS > 0                                        
  FOR #I = 1 TO #NUM-ERRORS                               
    PROCESS SQL SYSIBM-SYSDUMMY1                          
      <<GET DIAGNOSTICS CONDITION   :#I                   
      :#SQLCODE   = DB2_RETURNED_SQLCODE,                 
      :#SQLSTATE  = RETURNED_SQLSTATE,                    
      :#ROW_NUM = DB2_ROW_NUMBER>>                        
    PRINT 'DB2_RETURNED_SQLCODE:' #SQLCODE                
      'RETURNED_SQLSTATE:' #SQLSTATE                      
      'DB2_ROW_NUMBER:' #ROW_NUM (EM=99Z)                 
  END-FOR                                                 
END-IF                                                    
END TRANSACTION   
END