ITPub博客

首页 > 数据库 > Oracle > 使用 MERGE 语句 INSERT 不进去的一个例子

使用 MERGE 语句 INSERT 不进去的一个例子

原创 Oracle 作者:peter1166 时间:2016-08-18 12:50:16 0 删除 编辑


今天朋友给我看一个 SQL ,一个 MERGE 语句。 
看SQL,他的本意好像是,有一堆变量,一个表里有就更新,没有就插入。


SQL 文本如下;


MERGE INTO HI_SMPL T1
USING (SELECT VBLEN, POSNR
         FROM HI_SMPL
        WHERE VBLEN = 'VBELN00001'
          AND POSNR = 'PO0001') T2
ON (T2.VBLEN = T1.VBLEN AND T2.POSNR = T1.POSNR)
WHEN MATCHED THEN  
  UPDATE
     SET MATNR       = 'LS22A13WX/XTL',
         SPART       = 'CTV',
         ZMENG       = '4',
         SHOPCD      = 'CS0000164',
         DISP_DATE_F = '20160818',
         LAST_MOD_DT = SYSDATE,
         LAST_MOD_ID = 'IF'      
WHEN NOT MATCHED THEN
  INSERT
    (VBLEN,
     POSNR,
     MATNR,
     SPART,
     ZMENG,
     SHOPCD,
     DISP_DATE_F,
     REGI_DT,
     REGI_ID,
     DC_SMPL_APLY_ST)
  VALUES
    ('VBELN00001',
     'PO0001',
     'LS22A13WX/XTL',
     'CTV',
     '4',
     'CS0000164',
     '20160818',
     SYSDATE,
     'IF',
     '');


我让他用下面查一下,看看有没有结果。 




select * 
from  MCS_HQ.HI_GERP_DC_SMPL T1
      ,(SELECT VBLEN, POSNR
         FROM HI_SMPL
        WHERE VBLEN = 'VBELN00001'
          AND POSNR = 'PO0001') T2
where T2.VBLEN = T1.VBLEN AND T2.POSNR = T1.POSNR;


没有结果集, 但是没有插入。 
再一看, 
(SELECT VBLEN, POSNR
         FROM HI_SMPL
        WHERE VBLEN = 'VBELN00001'
          AND POSNR = 'PO0001') T2
这个就是空集,跟空集关联,当然没有结果了。 
MERGE 里 WHEN NOT MATCHED THEN 的意识,不是没有结果集就肯定执行。 
是两个非空集合,关联以后没有结果集才执行。 


建议 SQL 改成如下,应该就好了。 


MERGE INTO HI_SMPL T1
USING (SELECT  'VBELN00001' VBLEN, 'PO0001' POSNR
         FROM dual ) T2
ON (T2.VBLEN = T1.VBLEN AND T2.POSNR = T1.POSNR)
WHEN MATCHED THEN  
  UPDATE
     SET MATNR       = 'LS22A13WX/XTL',
         SPART       = 'CTV',
         ZMENG       = '4',
         SHOPCD      = 'CS0000164',
         DISP_DATE_F = '20160818',
         LAST_MOD_DT = SYSDATE,
         LAST_MOD_ID = 'IF'
WHEN NOT MATCHED THEN
  INSERT
    (VBLEN,
     POSNR,
     MATNR,
     SPART,
     ZMENG,
     SHOPCD,
     DISP_DATE_F,
     REGI_DT,
     REGI_ID,
     DC_SMPL_APLY_ST)
  VALUES
    ('VBELN00001',
     'PO0001',
     'LS22A13WX/XTL',
     'CTV',
     '4',
     'CS0000164',
     '20160818',
     SYSDATE,
     'IF',
     '');

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13696961/viewspace-2123664/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2015-06-26

  • 博文量
    10
  • 访问量
    14396