【存储过程】Merge Into语句实现Insert/Update在Oracle中的应用


  最近接到一个新的接口需求,开发一个保存数据的接口,需要完成如下功能:有一个表T,有两个字段a(主键),b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插入一条记录。
  在Microsoft的SQL语法中,很简单的一句判断就可以了,SQL Server中的语法如下:

if exists(select 1 from T where T.a=’1001’ ) update T set T.b=2 Where T.a=’1001’ else insert into T(a,b) values(‘1001’,2);

  但是因为现场的数据库是Oracle,所以不能用上面的语法,那么在Oracle中我们如何实现这种功能呢?首选方案就是使用存储过程。Oracle 9i之后有一条Merge into 的语句可以同时进行Insert和Update。
merge into语法:

MERGE INTO [target-table] A 
    USING [source-table sql] B 
        ON([conditional expression] and [...]...)  
WHEN MATCHED THEN  
    [UPDATE sql]  
WHEN NOT MATCHED THEN  
    [INSERT sql]  

将merge into用于以上的表逻辑:

MERGE INTO T t1
    USING (SELECT 'xxx' FROM T WHERE t.a='1001') t2
        ON(t1.a = t2.a)
WHEN MATCHED THEN
    UPDATE SET t1.b=2 WHERE t1.a='1001'
WHEN NOT MATCHED THEN
    INSERT (t1.a,t1.b) VALUES('1001','2')

以上语句实现的功能用中文来描述就是:
  在t2中查出来的数据,每一条都要跟t1进行ON(join condition)的比较。如果匹配,就进行更新,否则进行插入操作。
  所以,我们可以看出,在一个同时存在insert和update的merge的语句中,总共insert/update的记录数就是USING语句中t2的记录数。

附录(本次需求用到的存储过程实例):

create or replace procedure PRC_SAVE_USER_OPTIONS(MOBILENO in varchar2,
                                               LANGUAGES in varchar2) is
begin
  MERGE INTO tbl_v8_mobile_language tv
  USING (select nvl(max(t.MOBILE_NO), 'AAAAAAAAAAAAA') as MOBILE_NO
           from tbl_v8_mobile_language t
          where t.MOBILE_NO = MOBILENO) tv2
  ON (tv.MOBILE_NO = tv2.MOBILE_NO)
  WHEN MATCHED THEN
    UPDATE SET tv.LANGUAGE = LANGUAGES
  WHEN NOT MATCHED THEN
    INSERT (tv.mobile_no, tv.language) values (MOBILENO, LANGUAGES);
  commit;
end;

引申:
  上面我们说过“在一个同时存在insert和update的merge的语句中,总共insert/update的记录数就是USING语句中t2的记录数。”我们可以根据这个记录数的不同进行不同的操作。
1、只操作一张表的时候:
  当USING语句中查出来的值只有一条时就只能进行insert/update操作,有多条时就可以既能insert又能update。
如:
  1)当USING中的查询语句为SELECT ‘xxx’ FROM T t WHERE t.a=’1001’ (a为主键),此时t2中只有一条数据,只能进行insert/update操作。
  2)当USING中的查询语句为SELECT ‘xxx’ FROM T,查出T表中的所有数据,此时t2中的数据是表T的所有数据,这就是全表操作了,既能insert又能update。
2、操作两张表的时候:
  这种方法与操作一张表类似,只不过在操作一张表的时候t1、t2代表的都是一张表内的数据,而操作两张表的时候t1、t1代表的是两张表的数据。具体应用请参照这篇文章:oracle中merge into用法解析

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`INSERT INTO ... ON DUPLICATE KEY UPDATE` 和 `MERGE INTO` 都是用于在数据库进行更新或插入操作的语句。 `INSERT INTO ... ON DUPLICATE KEY UPDATE` 语句用于在插入一行数据时,如果该行数据已经存在于表,则更新该行数据的值,否则插入一行新数据。 例如: ``` INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, column3 = value3; ``` 其,如果 `(column1, column2)` 是表的主键或唯一索引,当插入 `(value1, value2, value3)` 这一行数据时,如果已经存在 `(value1, value2)` 这一行数据,则更新该行数据的值为 `(value1, value2, value3)`,否则插入一行新数据。 `MERGE INTO` 语句Oracle 数据库的一种语法,用于在一个表进行插入、更新和删除操作。它的语法如下: ``` MERGE INTO target_table USING source_table ON (condition) WHEN MATCHED THEN UPDATE SET column1 = value1, column2 = value2 WHEN NOT MATCHED THEN INSERT (column1, column2) VALUES (value1, value2) ``` 其,`target_table` 是目标表,`source_table` 是源表,`condition` 是连接条件,`UPDATE SET` 子句用于更新目标表的数据,`INSERT` 子句用于向目标表插入新数据。 `MERGE INTO` 语句能够实现 `INSERT INTO ... ON DUPLICATE KEY UPDATE` 的功能,同时还可以进行删除操作。但需要注意的是,`MERGE INTO` 语句只能在 Oracle 数据库使用,而 `INSERT INTO ... ON DUPLICATE KEY UPDATE` 语句则可以在其他数据库使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值