Tôi đã sử dụng mẫu mã đầu tiên trong nhiều năm. Thông báo không rõ ràng hơn là đếm.
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;
Mã dưới đây là mã mới và có thể được cải thiện
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)
Trong ví dụ đầu tiên, bản cập nhật thực hiện tra cứu chỉ mục. Nó phải, để cập nhật hàng bên phải. Oracle mở một con trỏ ẩn và chúng tôi sử dụng nó để bọc một phần chèn tương ứng để chúng tôi biết rằng phần chèn sẽ chỉ xảy ra khi khóa không tồn tại. Nhưng chèn là một lệnh độc lập và nó phải thực hiện tra cứu thứ hai. Tôi không biết hoạt động bên trong của lệnh hợp nhất nhưng vì lệnh là một đơn vị, nên Oracle có thể thực hiện thao tác chèn hoặc cập nhật chính xác với một tra cứu chỉ mục duy nhất.
Tôi nghĩ hợp nhất sẽ tốt hơn khi bạn thực hiện một số xử lý có nghĩa là lấy dữ liệu từ một số bảng và cập nhật bảng, có thể chèn hoặc xóa các hàng. Nhưng đối với trường hợp hàng đơn, bạn có thể xem xét trường hợp đầu tiên vì cú pháp phổ biến hơn.