好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Oracle merge合并更新函数实例详解

前言

MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。通过这个MERGE你能够在一个SQL语句中对一个表同时执行INSERT和UPDATE操作.

本博客介绍一下Oracle merge合并函数,业务场景:新增数据的时候要先查询数据库是否已经有改数据,有数据就更新数据,没数据才新增数据,这是很常见的业务场景,如果是用Oracle数据库的话,其实直接用merge函数效率更快,而且merge函数性能也相对比较好

merge函数的语法:

?

1

2

3

4

5

6

7

8

9

MERGE INTO table_name alias1

USING ( table | view |sub_query) alias2

ON ( join condition)

WHEN MATCHED THEN

  UPDATE table_name

  SET col1 = col_val1,

    col2 = col_val2

WHEN NOT MATCHED THEN

  INSERT (column_list) VALUES (column_values);

举个例子:

SQL实现,意思是有数据就更新,没数据才新增

?

1

2

3

4

5

6

7

8

9

10

11

12

13

MERGE INTO t_config_related A1 USING( select '97547758-6f85-419e-85f9-b8f711ca2660' seq,

    '97547758-6f85-419e-85f9-b8f711ca2658' tipsSeq,

    to_number( '1' ) appLevel,

    '24e1ccc38d9542189d1cc6c23f814a18' relaSeq from dual) A2

ON (A1.seq = A2.seq)

WHEN MATCHED THEN

UPDATE SET

   A1.tips_seq = A2.tipsSeq,  

   A1.app_level = A2.appLevel,

   A1.rela_seq = A2.relaSeq

WHEN NOT MATCHED THEN

INSERT (seq , tips_seq , app_level , rela_seq)

VALUES (A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq);

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

/**

   * 批量更新保存地区关联信息

   * @ date 2019年2月21日上午11:17:10

   * @ return

   */

 

  @RequestMapping( "/batchSaveTipsAreaConfig" )

  @ResponseBody

  public ResultModel batchSaveTipsConfig(ApprTipsRelatedModel relatedModel) {

 

   List<ApprTipsRelatedModel> areaTipsList = new ArrayList<ApprTipsRelatedModel>();

 

   //封装批量更新的地区列表

 

   String[] areaSeqs = StringUtils.split(relatedModel.getAreaSeq(), "," );

 

   for (String areaSeq : areaSeqs) {

 

    ApprTipsRelatedModel areaRelatedModelNew = new ApprTipsRelatedModel();

 

    areaRelatedModelNew.setSeq(commonService.generateUUID());

 

    areaRelatedModelNew.setTipsSeq(relatedModel.getTipsSeq());

 

    areaRelatedModelNew.setAppLevel(NumConstant.COMMON_NUM_TREE);

 

    areaRelatedModelNew.setRelaSeq(areaSeq);

 

    areaTipsList. add (areaRelatedModelNew);

 

  }

 

   //批量更新新增数据

 

   try {

 

    this.tipsConfigService.batchSaveTipsRelatedConfig(areaTipsList);

 

    return ResultModel.success( "保存成功" );

 

   } catch(Exception e) {

 

    logger.error( "批量绑定地区异常:{}" +e);

 

    throw new SuperControllerException();

 

   }

 

  }

注意要点:

在开发中我遇到一个异常,mybatis打印出来的SQL是这样的:

?

1

Preparing: MERGE INTO appr_tips_config_related A1 ? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON ( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ? WHEN MATCHED THEN ? ? UPDATE SET A1.seq = A2.seq, A1.tips_seq = A2.tipsSeq, A1.app_level = A2.appLevel, A1.rela_seq = A2.relaSeq ? ? ? WHEN NOT MATCHED THEN ? ? ? INSERT (seq,tip_seq,app_level,rela_seq) ? ? ? ? VALUES (A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq)

可以看出什么问题?打印出的SQL有很多问号,那是因为SQL有空格导致的,所以使用merge函数不用随便加空格,不然会报错的

?

1

? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON ( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ?

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:http://www.cnblogs.com/mzq123/p/10424506.html

查看更多关于Oracle merge合并更新函数实例详解的详细内容...

  阅读:34次