Я перший рік використовую перший зразок коду. Зауважте, що не знайдете, а не порахуйте.
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;
Нижче наведений код - це можливо новий і вдосконалений код
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)
У першому прикладі оновлення здійснює пошук індексу. Це потрібно для того, щоб оновити потрібний рядок. Oracle відкриває неявний курсор, і ми використовуємо його для загортання відповідної вставки, щоб ми знали, що вставка відбудеться лише тоді, коли ключа не існує. Але вставка - це незалежна команда, і вона повинна зробити другий пошук. Я не знаю внутрішньої роботи команди злиття, але оскільки команда є єдиним блоком, Oracle міг би виконати правильну вставку або оновити за допомогою одного пошуку індексу.
Я думаю, що злиття краще, коли у вас є якась обробка, яка означає взяття даних з деяких таблиць і оновлення таблиці, можливо, вставляючи або видаляючи рядки. Але для випадку одного рядка ви можете розглянути перший випадок, оскільки синтаксис є більш поширеним.