Je suis en retard à la fête, mais...
Avec oracle 11.2.0.1, il y a un indice sémantique qui peut faire ceci :IGNORE_ROW_ON_DUPKEY_INDEX
Exemple :
insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(customer_orders,pk_customer_orders) */
into customer_orders
(order_id, customer, product)
values ( 1234, 9876, 'K598')
;
MISE À JOUR :Bien que cet indice fonctionne (si vous l'épelez correctement), il existe de meilleures approches qui ne nécessitent pas Oracle 11R2 :
Première approche :traduction directe de l'indice sémantique ci-dessus :
begin
insert into customer_orders
(order_id, customer, product)
values ( 1234, 9876, 'K698')
;
commit;
exception
when DUP_VAL_ON_INDEX
then ROLLBACK;
end;
Deuxième approche :beaucoup plus rapide que les deux conseils ci-dessus lorsqu'il y a beaucoup de conflits :
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;