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.
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.
Dieses Statement steht nur bei Natural for Db2 zur Verfügung.
Syntax-Element | Beschreibung |
---|---|
MERGE INTO |
MERGE INTO-Klausel:
|
table-name |
Tabellenname:
Identifiziert das Ziel der Weitere Informationen siehe table-name. |
[AS]
correlation-name
|
[AS]
correlation-name-Klausel:
Gibt einen alternativen Namen für die Zieltabelle an. Der alternative Name kann als Qualifikationsmerkmal verwendet werden, wenn auf Spalten der Zwischenergebnistabelle verwiesen wird. |
include-columns |
Include Columns-Klausel:
Gibt einen Satz von Spalten an, die zusammen mit den
Spalten der Zieltabelle in die Ergebnistabelle des
Weitere Informationen siehe include-columns. |
USING
source-table |
USING
source-table-Klausel:
Gibt die Werte für die Zeilendaten an, die in der Zieltabelle zusammengeführt werden sollen. Siehe |
ON
search-condition |
ON
search-condition-Klausel:
Gibt Join-Bedingungen zwischen der Quelltabelle ( |
WHEN
matching-condition |
WHEN
matching-condition-Klausel:
Gibt die Bedingung an, für die die in der folgenden
|
THEN
modification-operation |
THEN
modification-operation-Klausel:
Gibt die Operation an, die bei den Übereinstimmungen mit
der in der vorangehenden |
ELSE IGNORE |
ELSE IGNORE-Klausel:
Legt fest, dass bei Quellspalten, die die in der
|
NOT ATOMIC CONTINUE ON
SQLEXCEPTION |
NOT ATOMIC CONTINUE ON
SQLEXCEPTION-Klausel:
Gibt an, ob die Zusammenführungsverarbeitung fortgesetzt wird, wenn bei der Verarbeitung einer Zeile eines Satzes von Quellzeilen ein Fehler auftritt. |
QUERYNO
integer |
QUERYNO
integer-Klausel:
Gibt die Nummer für dieses SQL-Statement an, die in der EXPLAIN-Ausgabe und den Db2-Trace-Aufzeichnungen verwendet wird. |
table-reference | ||||
(VALUES |
) | |||
[AS ]
correlation-name (column-name,...)
|
Syntax-Element | Beschreibung |
---|---|
table-reference |
Gibt die Quelltabelle an, die mit der Zieltabelle zusammengeführt werden soll. |
VALUES |
Mit dem Schlüsselwort
VALUES wird die Angabe von Werten für die Zeilendaten eingeleitet,
die in die Zieltabelle eingefügt werden sollen..
|
values-single-row |
Gibt eine einzelne Zeile der Quelldaten an. Siehe values-single-row. |
values-multiple-row |
Gibt mehrere Zeilen der Quelldaten an. Siehe values-multiple-row. |
[AS]
correlation-name |
Gibt einen Korrelationsnamen für die Quelltabelle an. |
column-name |
Gibt einen Spaltennamen an, um die
Eingabedaten mit der UPDATE
SET assignment-clause
(Zuweisungsklausel) für eine UPDATE -Operation oder mit der
VALUES -Klausel für eine INSERT -Operation zu
verbinden.
|
[NOT ]
MATCHED [AND
search-condition]
|
Syntax-Element | Beschreibung |
---|---|
[NOT] MATCHED |
Gibt die
modification-operation
(Änderungsoperation) an, die durchgeführt werden soll, wenn eine ON
search-condition -Suchbedingung als wahr oder
nicht wahr ausgewertet wird (NOT kann optional angegeben
werden).
|
AND
search-condition |
Gibt eine (optionale) zusätzliche
Bedingung an, die als wahr ausgewertet werden muss, bevor die
modification-operation
durchgeführt wird.
|
update-operation )
|
||||
DELETE |
||||
signal-operation |
||||
insert-operation |
Syntax-Element | Beschreibung |
---|---|
update-operation |
Gibt an, dass die übereinstimmende
Zielzeile mit den in der Zuweisungsklausel (UPDATE
SET assignment-clause)
zugewiesenen Werten geändert wird.
Eine |
DELETE |
Gibt an, dass die übereinstimmende
Zielzeile gelöscht wird. Eine DELETE -Operation ist nur zulässig,
wenn die Übereinstimmungsbedingung
(matching-condition ) als wahr
ausgewertet wird.
|
signal-operation |
Gibt den SQL-Fehler an, der ausgelöst
werden soll.
Eine |
insert-operation |
Gibt die Zeilen an, die in die
Zieltabelle eingefügt werden sollen.
Eine |
SIGNAL
SQLSTATE
[VALUE] sqlstate
[SET
MESSAGE_TEXT =
scalar-expression ] |
( | ,...) |
Syntax-Element | Beschreibung |
---|---|
expression |
Skalar-Ausdruck:
Gibt einen Skalar-Ausdruck an. Siehe Skalar-Ausdrücke. |
NULL |
NULL-Wert:
Gibt den |
FOR |
host-variable |
ROWS |
|||||||||||||||
( | ,...) |
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
|
NULL |
NULL-Wert:
Gibt den |
FOR ... ROWS |
Anzahl der zusammenzuführenden
Zeilen:
Diese Klausel gibt die Anzahl der zusammenzuführenden
Zeilen an. |
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 |
column-name = | expression | ,... | |||||
DEFAULT |
|||||||
NULL |
|||||||
(column-name,...) = ( | expression | ,...) | |||||
DEFAULT |
|||||||
NULL |
INSERT
[(column-name,...)]
VALUES (
|
,...) |
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
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
Zusammenführung von Verkaufsdaten aus der Tabelle
MSALES
in die Tabelle MPRODUCT
. Demonstration der
MERGE
-Operation mit den Statements DELETE
,
UPDATE
, INSERT
und SIGNAL
.
DEFINE DATA LOCAL USING DEMSQLCA LOCAL 1 V1 VIEW OF MPRODUCT 2 ID 2 NAME 2 INVENTORY 1 #M_TEXT (A10) INIT <'Oversold: '> END-DEFINE ... MERGE INTO MPRODUCT AS T USING (SELECT MSALES.ID ,SUM(MSALES.SOLD) AS SOLD, MAX(MCATALOG.NAME) AS NAME FROM MSALES, MCATALOG WHERE MSALES.ID = MCATALOG.ID GROUP BY MSALES.ID) AS S (ID,SOLD,NAME) ON S.ID = T.ID WHEN MATCHED AND T.INVENTORY = S.SOLD THEN DELETE WHEN MATCHED AND T.INVENTORY < S.SOLD THEN SIGNAL SQLSTATE '78000' SET MESSAGE_TEXT =:#M_TEXT || S.NAME WHEN MATCHED THEN UPDATE SET T.INVENTORY = T.INVENTORY - S.SOLD WHEN NOT MATCHED THEN INSERT VALUES(S.ID, S.NAME, -S.SOLD) END TRANSACTION END