Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insérer s'il n'existe pas Oracle

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;