Oracle: как к UPSERT (обновляют или вставляют в таблицу?)

в этой статье предлагаются некоторые решения для бутстрапа css http://eddmann.com/posts/providing-local-js-and-css-resources-for-cdn-fallbacks/

, альтернативно это работает для fontawesome



275
задан Mark Harrison 27 October 2008 в 15:25
поделиться

5 ответов

Альтернатива СЛИЯНИЮ ("старомодный путь"):

begin
   insert into t (mykey, mystuff) 
      values ('X', 123);
exception
   when dup_val_on_index then
      update t 
      set    mystuff = 123 
      where  mykey = 'X';
end;   
50
ответ дан Tony Andrews 4 November 2019 в 11:45
поделиться

Другая альтернатива без проверки исключения:

UPDATE tablename
    SET val1 = in_val1,
        val2 = in_val2
    WHERE val3 = in_val3;

IF ( sql%rowcount = 0 )
    THEN
    INSERT INTO tablename
        VALUES (in_val1, in_val2, in_val3);
END IF;
45
ответ дан Brian Schmitt 4 November 2019 в 11:45
поделиться

Оператор MERGE объединяет данные между двумя таблицами. Используя ДВОЙНОЙ позволяет нам использовать эту команду. Обратите внимание, что это не защищено от параллельного доступа.

create or replace
procedure ups(xa number)
as
begin
    merge into mergetest m using dual on (a = xa)
         when not matched then insert (a,b) values (xa,1)
             when matched then update set b = b+1;
end ups;
/
drop table mergetest;
create table mergetest(a number, b number);
call ups(10);
call ups(10);
call ups(20);
select * from mergetest;

A                      B
---------------------- ----------------------
10                     2
20                     1
207
ответ дан Mark Harrison 4 November 2019 в 11:45
поделиться

Из http://www.praetoriate.com/oracle_tips_upserts.htm :

"В Oracle9i UPSERT может выполнить эту задачу одним оператором: «

INSERT
FIRST WHEN
   credit_limit >=100000
THEN INTO
   rich_customers
VALUES(cust_id,cust_credit_limit)
   INTO customers
ELSE
   INTO customers SELECT * FROM new_customers;
-6
ответ дан 23 November 2019 в 02:06
поделиться

Двойной пример выше, который находится в PL / SQL, был великолепен, потому что я хотел сделать что-то подобное, но я хотел это на стороне клиента ... так что вот SQL, который я использовал для отправки аналогичного оператора прямо из некоторого C #

MERGE INTO Employee USING dual ON ( "id"=2097153 )
WHEN MATCHED THEN UPDATE SET "last"="smith" , "name"="john"
WHEN NOT MATCHED THEN INSERT ("id","last","name") 
    VALUES ( 2097153,"smith", "john" )

Однако с точки зрения C # это обеспечивает более медленное выполнение, чем выполнение обновления и проверка, были ли затронутые строки равными 0, и выполнение вставки, если это было.

102
ответ дан 23 November 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: