UPS一次UPSERT多个语句

时间:2015-09-24 19:47:52

标签: sql oracle

我有一些随机更新语句,例如:

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;

我需要在PLSQL内部插入这些多个语句。我发现一次一个地插入语法:

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并且只有一个pl / sql表来完成所有这些)。

TAB1:
| ID | A | B | D |

TAB2:
| ID | D |

1 个答案:

答案 0 :(得分: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),但是如果dup_val_on_index ...那么基于id列进行更新... tab1上的唯一约束是什么?