Ab Version 9.0 bietet Oracle die Möglichkeit, Insert- und Update-Statements zu kombinieren. Werden beispielsweise ständig neue Daten in eine Hilfstabelle eingespielt, anhand derer Einträge in Tabellen zum Teil ergänzt (bei komplett neuen Datensätzen), zum Teil aber auch geändert werden müssen (bei bereits vorhandenen Datensätzen), so kann dies mit MERGE in einem Schritt erfolgen.
Ab Version 10g kann auch ein Delete-Statement integriert werden.
Syntax:
MERGE INTO [schema .] table [t_alias]
USING [schema .] { table | view | subquery } [t_alias]
ON ( condition )
WHEN MATCHED THEN UPDATE SET column = { expr | DEFAULT }
[, column = { expr | DEFAULT }....]
DELETE WHERE <bedingung>
WHEN NOT MATCHED THEN INSERT ( column [, column...]) VALUES ( expr [, expr...]);
Die Verknüpfungsbedingung muss in Klammern stehen, sonst erhält man die nicht besonders erhellende Fehlermeldung ORA-00969: Schlüsselwort ON fehlt
Beispiel:
CREATE TABLE annsal(empno NUMBER, peryear NUMBER);
INSERT INTO annsal (empno)
SELECT empno FROM emp WHERE deptno = 10;
SELECT * FROM annsal;
EMPNO PERYEAR
------ ----------
7782
7839
7934
MERGE INTO annsal a USING emp e ON (a.empno = e.empno)
WHEN MATCHED THEN
UPDATE SET a.peryear = (e.sal *12 + NVL(e.comm,0))
DELETE WHERE empno = 7934
WHEN NOT MATCHED THEN
INSERT (a.empno, a.peryear) VALUES (e.empno, e.sal *12 + NVL(e.comm,0));
SELECT * FROM annsal;
EMPNO PERYEAR
------ --------
7782 29400
7839 60000
7934 15600
7902 36000
7900 11400
7521 15500
7654 16400
7566 35700
7844 18000
7499 19500
7698 34200
7788 36000
7369 9600
7876 13200
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.