Pierwszej próbki kodu używam od lat. Zauważ, że nie znaleziono, a nie policz.
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;
Poniższy kod jest prawdopodobnie nowym i ulepszonym kodem
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)
W pierwszym przykładzie aktualizacja wykonuje wyszukiwanie indeksu. Musi to zrobić, aby zaktualizować prawy wiersz. Oracle otwiera niejawny kursor i używamy go do zawijania odpowiedniej wstawki, abyśmy wiedzieli, że wstawka nastąpi tylko wtedy, gdy klucz nie istnieje. Ale wstawka jest niezależnym poleceniem i musi wykonać drugie wyszukiwanie. Nie znam wewnętrznego działania polecenia scalania, ale ponieważ polecenie to pojedyncza jednostka, Oracle może wykonać poprawne wstawienie lub aktualizację za pomocą pojedynczego wyszukiwania indeksu.
Myślę, że scalanie jest lepsze, gdy trzeba wykonać pewne przetwarzanie, co oznacza pobieranie danych z niektórych tabel i aktualizowanie tabeli, ewentualnie wstawianie lub usuwanie wierszy. Ale w przypadku pojedynczego wiersza można rozważyć pierwszy przypadek, ponieważ składnia jest częstsza.