Mybatis Oracle中实现”存在则更新,不存在则插入”的语句

在 MYSQL中,实现要实现在一张表中”更新一条信息,如果不存在则插入“,通常是用ON DUPLICATE KEY UPDATE实现的。举个例子,现在有个应用场景,在客户表(CUSTOMER)里添加一条数据,如果存在该客户(通过主键客户号和账号判断)则更新该客户的手机号(CUST_MOBILE)、购买次数(BUY_TIMES)购买日期(BUY_DATE)

客户表:CUSTOMER
NAME CODE PRIMARY
客户号 CUST_NO ✔️
客户账号 CUST_ACCT ✔️
客户姓名 CUST_NAME  
客户手机号 CUST_MOBILE  
购买次数 BUY_TIMES  
购买日期 BUY_DATE  

使用MYSQL  ON DUPLICATE KEY UPDATE 实现

insert into CUSTOMER
(
CUST_NO,
CUST_ACCT,
CUST_NAME,
CUST_MOBILE,
BUY_TIMES,
BUY_DATE
)
values(
#{CUST_NO},
#{CUST_ACCT},
#{CUST_NAME},
#{CUST_MOBILE},
'1',
${BUY_DATE}
)
ON DUPLICATE KEY UPDATE
CUST_MOBILE=#{CUST_MOBILE},
BUY_TIMES=BUY_TIMES+1,
BUY_DATE=#{_CURR_DATE}

那么在ORACLE中,如何使用语句实现类似MYSQL中 使用ON DUPLICATE KEY UPDATE 语句的效果呢,语句如下所示

merge into CUSTMOER t1
using (select #{CUST_NO} CUST_NO,#{CUST_ACCT} CUST_ACCT from dual)t2
on (t1.CUST_NO=t2.CUST_NO and t1.CUST_ACCT=t2.CUST_ACCT)
when matched then
update set 
t1.CUST_MOBILE=#{CUST_MOBILE},
t1.BUY_TIMES=BUY_TIMES+1,
t1.BUY_DATE=#{_CURR_DATE}
where t1.CUST_NO=#{CUST_NO} and t1.CUST_ACCT=#{CUST_ACCT}
when not matched then insert(
t1.CUST_NO,
t1.CUST_ACCT,
t1.CUST_NAME,
t1.CUST_MOBILE,
t1.BUY_TIMES,
t1.BUY_DATE
)
values
(
#{CUST_NO},
#{CUST_ACCT},
#{CUST_NAME},
#{CUST_MOBILE},
'1',
#{_CURR_DATE}
)

关于ORACLE 的 dual表,感兴趣的同学可以参考

http://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.html

你可能感兴趣的:(ORACLE)