Saya telah menggunakan contoh kode pertama selama bertahun-tahun. Perhatikan notfound daripada count.
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;
Kode di bawah ini adalah kode yang mungkin baru dan lebih baik
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)
Pada contoh pertama pembaruan melakukan pencarian indeks. Itu harus, untuk memperbarui baris yang tepat. Oracle membuka kursor implisit, dan kami menggunakannya untuk membungkus sisipan yang sesuai sehingga kami tahu bahwa sisipan hanya akan terjadi ketika kunci tidak ada. Tetapi sisipan adalah perintah independen dan harus melakukan pencarian kedua. Saya tidak tahu cara kerja dari perintah penggabungan tetapi karena perintah adalah satu unit, Oracle bisa mengeksekusi memasukkan yang benar atau memperbarui dengan pencarian indeks tunggal.
Saya pikir penggabungan lebih baik ketika Anda memiliki beberapa pemrosesan yang harus dilakukan yang berarti mengambil data dari beberapa tabel dan memperbarui tabel, mungkin menyisipkan atau menghapus baris. Tetapi untuk kasus baris tunggal, Anda dapat mempertimbangkan kasus pertama karena sintaksis lebih umum.