sql >> Database >  >> RDS >> Oracle

Invoegen indien niet bestaat Oracle

Ik kom te laat op het feest, maar...

Met orakel 11.2.0.1 is er een semantische hint die dit kunnen:IGNORE_ROW_ON_DUPKEY_INDEX

Voorbeeld:

insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX(customer_orders,pk_customer_orders) */
  into customer_orders
       (order_id, customer, product)
values (    1234,     9876,  'K598')
     ;

UPDATE :Hoewel deze hint werkt (als u hem correct spelt), zijn er betere benaderingen waarvoor Oracle 11R2 niet nodig is:

Eerste benadering—directe vertaling van bovenstaande semantische hint:

begin
  insert into customer_orders
         (order_id, customer, product)
  values (    1234,     9876,  'K698')
  ;
  commit;
exception
  when DUP_VAL_ON_INDEX
  then ROLLBACK;
end;

Tweede benadering—een veel sneller dan beide bovenstaande hints als er veel onenigheid is:

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;


  1. Hoe krijg ik de namen van alle kolommen voor alle tabellen in MySQL?

  2. Krijg alleen datum zonder tijd in Oracle

  3. Rails 3.1 - Pushen naar Heroku - Fouten bij het installeren van de postgres-adapter?

  4. SQL, Bij het verwijderen van cascade en bij het bijwerken van cascade