Đến bữa tiệc muộn, nhưng ...
Với oracle 11.2.0.1, có một gợi ý về ngữ nghĩa có thể làm được điều này: IGNORE_ROW_ON_DUPKEY_INDEX
Ví dụ:
insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(customer_orders,pk_customer_orders) */
into customer_orders
(order_id, customer, product)
values ( 1234, 9876, 'K598')
;
CẬP NHẬT :Mặc dù gợi ý này hoạt động (nếu bạn viết đúng chính tả), có những cách tiếp cận tốt hơn mà không yêu cầu Oracle 11R2:
Cách tiếp cận đầu tiên — bản dịch trực tiếp gợi ý ngữ nghĩa ở trên:
begin
insert into customer_orders
(order_id, customer, product)
values ( 1234, 9876, 'K698')
;
commit;
exception
when DUP_VAL_ON_INDEX
then ROLLBACK;
end;
Lần tiếp cận thứ hai — một lô nhanh hơn cả hai gợi ý trên khi có nhiều tranh cãi:
begin
select count (*)
into l_is_matching_row
from customer_orders
where order_id = 1234
;
if (l_is_matching_row = 0)
then
insert into customer_orders
(order_id, customer, product)
values ( 1234, 9876, 'K698')
;
commit;
end if;
exception
when DUP_VAL_ON_INDEX
then ROLLBACK;
end;