Dieser Abschnitt 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 angegebenen
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 vorhandenes 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 vorhandenes 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