Oracle INSERT ALL WHEN条件

时间:2014-08-23 19:48:37

标签: sql oracle

使用Oracle 11g RAC

我想根据条件使用INSERT ALL插入一个或两个表。我试图在常规SQL中执行此操作,而不是在可能的情况下执行此操作。我读取了SELECT部分​​中的变量需要满足的WHEN条件,但我不确定是否有一些Oracle技巧可以返回我需要的东西。这就是我想要做的事情:

INSERT ALL
  --if the order from table A doesnt exist in table B then insert it
  WHEN ( if a.ord_id = b.ord_id then skip) THEN
    INTO tableB (ord_id, ord_dt, ord_type, ord_sys) VALUES (ord_id,ord_dt, ord_type,ord_sys)
  --always insert into table C
  WHEN 1=1 THEN
   INTO tableC (ord_id, item_id, item_dt) VALUES (ord_id, 1234, SYSDATE)
  SELECT a.ord_id, a.ord_dt, a.ord_type, a.ord_sys
  FROM tableA a, tableB b
  WHERE a.ord_id = b.ord_id
  AND ord_type = 'N';

我尝试了几种不同的东西,但似乎无法让条件真正发挥作用。我认为上面的逻辑不会起作用,因为它完全消除了选择,但我认为它会更容易理解。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

你问题是你的第一个问题; WHEN ( if a.ord_id = b.ord_id then skip) THEN conditional insert clause(因为它显然已知)实际上看起来像这样(为便于阅读而简化)

[ ALL | FIRST ]
WHEN condition
THEN insert_into_clause
  [ values_clause ]
  [ insert_into_clause [ values_clause ] ]...
[ WHEN condition
  THEN insert_into_clause
    [ values_clause ]
]...
[ ELSE insert_into_clause
  [ values_clause ]
]

正如您所见,WHEN只需要一个条件,即a.ord_id = b.ord_id之类的布尔语句。您不能使用IF语句或其他关键字,例如SKIP。

您在代码中的评论是"如果表A中的订单不存在于表B中,则将其插入" 。如果在tableatableb之间执行外连接,则b中的不存在由订单为NULL定义(请参阅A Visual Explanation of SQL Joins)。您可以使用此事实来创建条件

insert all
 when b.ord_id is null then
   into tableb (ord_id, ord_dt, ord_type, ord_sys) 
   values (ord_id, ord_dt, ord_type, ord_sys)
 when 1 = 1 then
   into tablec (ord_id, item_id, item_dt) 
   values (ord_id, 1234, sysdate)
select a.ord_id, a.ord_dt, a.ord_type, a.ord_sys
  from tablea a
  left outer join tableb b
    on a.ord_id = b.ord_id
 where a.ord_type = 'N';

如果ORD_TYPE实际上在tableb中,则您必须删除WHERE子句并将此条件添加到JOIN中。