正常语句如下:MERGE INTO A   
   USING (SELECT * FROM table1) B  
   ON (A.COL1 = (B.COL1) )  
   WHEN MATCHED THEN  
 UPDATE ......
   WHEN NOT MATCHED THEN  
 INSERT ......
可否实现这样功能:
MERGE INTO A   
   USING (SELECT * FROM table1) B  
   ON (A.COL1 = (B.COL1) )  
   WHEN MATCHED THEN  
          IF ... THEN 
                  UPDATE ......
          END IF
   WHEN NOT MATCHED THEN  
 INSERT ......
望各位高手不吝赐教,非常感谢!100分恭候。

解决方案 »

  1.   

    可否把你的逻辑写到UPDATE ......语句中实现,而不要放到UPDATE ......以外.
      

  2.   

    不可以,merge不是pl/sql,是一条语句而已,不能有if ... 判断语句。
    一楼的意见可以参考。
      

  3.   

    多谢楼上两位!!但是,还有个问题:我可不可以在merge语句中有选择地使用matched或not matched?
    比如:
    WHEN MATCHED THEN 
          --Do update here 
          ......
       WHEN NOT MATCHED THEN  
          --Do nothing请各位高手指教!多多感谢!
      

  4.   

    不行的,merge_insert_clause子句只能是下面的格式:
    INSERT ( column [, column]... ) VALUES ( expr [, expr]... )
    不能是其他pl/sql语句,也不能是insert ... select... 的格式,所以也不能插入空的记录集
    同理merge_update_clause也是一样的
    如果是WHEN NOT MATCHED THEN  --Do nothing的话,用一般的update语句就可以完成了啊
      

  5.   

    WHEN MATCHED THEN 
          --Do update here 
          ......
       WHEN NOT MATCHED THEN 
          NULL; --用NULL试试
    楼主试一下不就知道了
      

  6.   

    null是不行的,只能是这种格式:
    INSERT ( column [, column]... ) VALUES ( expr [, expr]... )MERGE INTO test1 A
       USING (SELECT * FROM test2) b
       ON (A.id = B.id )
       WHEN MATCHED THEN
     UPDATE set a.kssj = b.kssj
       WHEN NOT MATCHED THEN
     insert values(b.id,2312,2321)SQL> 
      8  /DoneSQL> 
      8  /MERGE INTO test1 A
       USING (SELECT * FROM test2) b
       ON (A.id = B.id )
       WHEN MATCHED THEN
     UPDATE set a.kssj = b.kssj
       WHEN NOT MATCHED THEN
     null
    ORA-00905: 缺少关键字
      

  7.   

    其实你想用merge在不匹配时不做任何事,其实就是普通的update。反之想匹配时不做任何事就是insert。
      

  8.   

    不同的需求就用不同的语法:只插入就用insert
    只更新就用update
    既要更新又要插入,那就用merge
      

  9.   

    这里的需求就用UPDATE语句好一些.