2015-09-24 7 views
0

У меня есть несколько случайных операторов обновления, такие как это:UPSERT несколько операторов одновременно Oracle SQL

UPDATE tab1 SET a = 'a', b = 'b' WHERE id = 1; 
UPDATE tab2 SET c= = 'c' WHERE id = 2; 
UPDATE tab1 SET a = 'a', d = 'd' WHERE id = 3; 
. 
. 
. 
UPDATE tab1 SET a = 'a', b = 'b' WHERE id = 100; 

Мне нужно upsert эти несколько операторов внутри PLSQL. Я нашел синтаксис upsert по одному:

begin 
    insert into tab1 (a,b); 
     values ('a', 'b'); 
exception 
    when dup_val_on_index then 
     UPDATE tab SET a = 'a', b = 'b' WHERE id = 1; 
end 

Меня не беспокоит параллелизм, у меня есть много инструкций обновления мне нужно вставить сразу (сразу, потому что я использую Oracle APEX и имеют только один пл/sql-лист, чтобы сделать все это).

TAB1: 
| ID | A | B | D | 

TAB2: 
| ID | D | 
+0

Использование ** [MERGE] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9016.htm) ** – lad2025

+0

@ lad2025 Я просмотрел слияние, но, похоже, это для обновление нескольких таблиц, имеющих отношения? Кажется, что существует соединение между двумя таблицами, которых у меня нет. – user2924127

+1

«Слияние» может решить вашу проблему. просто укажите структуру таблицы и данные выборки. – RubahMalam

ответ

3

Я думаю, что это будет легче объяснить с ответом.

Посмотрите на это MERGE заявлении

MERGE INTO tab1 tab1  
     USING 
     (SELECT 'a' a, 'b' b, null c, null d, 1 id from dual 
     UNION ALL 
     SELECT null a, null b, 'c' c, null d, 2 id from dual 
     UNION ALL 
     SELECT 'a' a, null b, null c, 'd' d, 3 id from dual 
     UNION ALL 
     SELECT 'a' a, 'b' b, null c, null d, 100 id from dual) my_table 
    ON (tab1.id = my_table.id) 
    WHEN MATCHED THEN UPDATE SET tab1.a=my_table.a, tab1.b=my_table.b, 
    tab1.c=my_table.c, tab1.d=my_table.d 
    WHEN NOT MATCHED THEN INSERT (id, a, b, c, d) 
    VALUES (my_table.id, my_table.a, my_table.b, my_table.c, my_table.d) 

Я не использую любую вторую таблицу базы данных, я просто используя значения, которые поставляются в вашем примере выше:

UPDATE tab1 SET a = 'a', b = 'b' WHERE id = 1; 
UPDATE tab2 SET c= = 'c' WHERE id = 2; 
UPDATE tab1 SET a = 'a', d = 'd' WHERE id = 3; 
. 
. 
. 
UPDATE tab1 SET a = 'a', b = 'b' WHERE id = 100; 

Это становится "my_table". Затем вы можете обновить или вставить соответственно.

Я не 100%, что является уникальным значением в вашем примере выше.

Вы вставляете только столбец (a, b), а затем обновляете на основе столбца id, если dup_val_on_index ... каковы уникальные ограничения на tab1?

+0

Спасибо, что это намного яснее! Я представил простой пример моей проблемы, но что, если у меня есть несколько условий для оператора where? – user2924127

+0

Главное - просто предоставить предоставленные данные и понять, где предложение WHERE находится в инструкции слияния. http://psoug.org/reference/merge.html –

Смежные вопросы