Ich verwende seit Jahren das erste Codebeispiel. Beachten Sie nicht gefunden, anstatt zu zählen.
UPDATE tablename SET val1 = in_val1, val2 = in_val2
WHERE val3 = in_val3;
IF ( sql%notfound ) THEN
INSERT INTO tablename
VALUES (in_val1, in_val2, in_val3);
END IF;
Der folgende Code ist der möglicherweise neue und verbesserte Code
MERGE INTO tablename USING dual ON ( val3 = in_val3 )
WHEN MATCHED THEN UPDATE SET val1 = in_val1, val2 = in_val2
WHEN NOT MATCHED THEN INSERT
VALUES (in_val1, in_val2, in_val3)
Im ersten Beispiel führt das Update eine Indexsuche durch. Es muss, um die rechte Zeile zu aktualisieren. Oracle öffnet einen impliziten Cursor und verwendet ihn, um eine entsprechende Einfügung zu verpacken, damit wir wissen, dass die Einfügung nur erfolgt, wenn der Schlüssel nicht vorhanden ist. Die Einfügung ist jedoch ein unabhängiger Befehl und muss eine zweite Suche durchführen. Ich kenne das Innenleben des Befehls merge nicht, aber da der Befehl eine einzelne Einheit ist, hätte Oracle die korrekte Einfügung oder Aktualisierung mit einer einzelnen Indexsuche ausführen können.
Ich denke, Zusammenführen ist besser, wenn Sie eine Verarbeitung durchführen müssen, dh Daten aus einigen Tabellen entnehmen und eine Tabelle aktualisieren, möglicherweise Zeilen einfügen oder löschen. Für den Fall einer einzelnen Zeile können Sie jedoch den ersten Fall in Betracht ziehen, da die Syntax häufiger verwendet wird.