Oracle MERGE INTO的使用方法

Oracle MERGE INTO的使用方法

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

           非常多时候我们会出现例如以下情境,假设一条数据在表中已经存在,对其做update,假设不存在,将新的数据插入.假设不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这种话须要写很多其它的代码,同一时候性能也不好,要来回数据库两次.使用merge的话则能够一条SQL语句完毕.

1)主要功能 
提供有条件地更新和插入数据到数据库表中 
假设该行存在,运行一个UPDATE操作,假设是一个新行,运行INSERT操作 
    — 避免了分开更新 
    — 提高性能并易于使用 
    — 在数据仓库应用中十分实用 

2)MERGE语句的语法例如以下: 

MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] 

{ table | view | subquery } [t_alias] ON ( condition ) 

WHEN MATCHED THEN merge_update_clause 

WHEN NOT MATCHED THEN merge_insert_clause; 

3)演示样例

MERGE INTO TABLE TARGET
USING (SELECT '111111111' STORE_NO,
              '2014-01' TARGET_YM,
              '1' TARGET_D01,
              '2' TARGET_D02,
              '2' TARGET_D03,
              '2' TARGET_D04,
              '2' TARGET_D05,
              '2' TARGET_D06,
              '2' TARGET_D07,
              '2' TARGET_D08,
              '2' TARGET_D09,
              '2' TARGET_D10,
              '2' TARGET_D11,
              '2' TARGET_D12,
              '2' TARGET_D13,
              '2' TARGET_D14,
              '2' TARGET_D15,
              '2' TARGET_D16,
              '2' TARGET_D17,
              '2' TARGET_D18,
              '2' TARGET_D19,
              '2' TARGET_D20,
              '2' TARGET_D21,
              '2' TARGET_D22,
              '2' TARGET_D23,
              '2' TARGET_D24,
              '2' TARGET_D25,
              '2' TARGET_D26,
              '2' TARGET_D27,
              '2' TARGET_D28,
              '2' TARGET_D29,
              '2' TARGET_D30,
              '2' TARGET_D31,
              1 USER_ID
         FROM DUAL) TEMP
ON (TARGET.STORE_NO = TEMP.STORE_NO AND TARGET.TARGET_YM = TEMP.TARGET_YM)
WHEN MATCHED THEN
  UPDATE
     SET TARGET.TARGET_D01  = TEMP.TARGET_D01,
         TARGET.TARGET_D02  = TEMP.TARGET_D02,
         TARGET.TARGET_D03  = TEMP.TARGET_D03,
         TARGET.TARGET_D04  = TEMP.TARGET_D04,
         TARGET.TARGET_D05  = TEMP.TARGET_D05,
         TARGET.TARGET_D06  = TEMP.TARGET_D06,
         TARGET.TARGET_D07  = TEMP.TARGET_D07,
         TARGET.TARGET_D08  = TEMP.TARGET_D08,
         TARGET.TARGET_D09  = TEMP.TARGET_D09,
         TARGET.TARGET_D10  = TEMP.TARGET_D10,
         TARGET.TARGET_D11  = TEMP.TARGET_D11,
         TARGET.TARGET_D12  = TEMP.TARGET_D12,
         TARGET.TARGET_D13  = TEMP.TARGET_D13,
         TARGET.TARGET_D14  = TEMP.TARGET_D14,
         TARGET.TARGET_D15  = TEMP.TARGET_D15,
         TARGET.TARGET_D16  = TEMP.TARGET_D16,
         TARGET.TARGET_D17  = TEMP.TARGET_D17,
         TARGET.TARGET_D18  = TEMP.TARGET_D18,
         TARGET.TARGET_D19  = TEMP.TARGET_D19,
         TARGET.TARGET_D20  = TEMP.TARGET_D20,
         TARGET.TARGET_D21  = TEMP.TARGET_D21,
         TARGET.TARGET_D22  = TEMP.TARGET_D22,
         TARGET.TARGET_D23  = TEMP.TARGET_D23,
         TARGET.TARGET_D24  = TEMP.TARGET_D24,
         TARGET.TARGET_D25  = TEMP.TARGET_D25,
         TARGET.TARGET_D26  = TEMP.TARGET_D26,
         TARGET.TARGET_D27  = TEMP.TARGET_D27,
         TARGET.TARGET_D28  = TEMP.TARGET_D28,
         TARGET.TARGET_D29  = TEMP.TARGET_D29,
         TARGET.TARGET_D30  = TEMP.TARGET_D30,
         TARGET.TARGET_D31  = TEMP.TARGET_D31,
         TARGET.OPT_COUNTER = TARGET.OPT_COUNTER + 1,
         TARGET.UPDATE_BY   = TEMP.USER_ID,
         TARGET.UPDATE_DATE = SYSDATE
WHEN NOT MATCHED THEN
  INSERT
  VALUES
    (SEQ.NEXTVAL,
     TEMP.STORE_NO,
     TEMP.TARGET_YM,
     TEMP.TARGET_D01,
     TEMP.TARGET_D02,
     TEMP.TARGET_D03,
     TEMP.TARGET_D04,
     TEMP.TARGET_D05,
     TEMP.TARGET_D06,
     TEMP.TARGET_D07,
     TEMP.TARGET_D08,
     TEMP.TARGET_D09,
     TEMP.TARGET_D10,
     TEMP.TARGET_D11,
     TEMP.TARGET_D12,
     TEMP.TARGET_D13,
     TEMP.TARGET_D14,
     TEMP.TARGET_D15,
     TEMP.TARGET_D16,
     TEMP.TARGET_D17,
     TEMP.TARGET_D18,
     TEMP.TARGET_D19,
     TEMP.TARGET_D20,
     TEMP.TARGET_D21,
     TEMP.TARGET_D22,
     TEMP.TARGET_D23,
     TEMP.TARGET_D24,
     TEMP.TARGET_D25,
     TEMP.TARGET_D26,
     TEMP.TARGET_D27,
     TEMP.TARGET_D28,
     TEMP.TARGET_D29,
     TEMP.TARGET_D30,
     TEMP.TARGET_D31,
     NULL,
     DEFAULT,
     DEFAULT,
     NULL,
     TEMP.USER_ID,
     DEFAULT,
     NULL,
     NULL);

小帮助:

看到数据库表这么多字段是不是好烦,拷贝、写都麻烦还easy出错,能够例如以下操作:

1、先查询出表的全部字段

SELECT COLUMN_ID,
       COLUMN_NAME,
       DATA_TYPE,
       DATA_LENGTH,
       DATA_PRECISION,
       DATA_SCALE,
       NULLABLE,
       DATA_DEFAULT
  FROM USER_TAB_COLUMNS
 WHERE TABLE_NAME = 'TABLE'
 ORDER BY COLUMN_ID

2、将该表列名复制到Excel,使用函数CONCATENATE

Oracle MERGE INTO的使用方法

Oracle MERGE INTO的使用方法

Oracle MERGE INTO的使用方法

举一反三啦,非常多时候都能够用到的,整理自网络

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118892.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle 19c之RPM安装「建议收藏」

    Oracle 19c之RPM安装「建议收藏」Oracle19c,或者说是Oracle12.2.0.3,是12c中稳定的版本,就像Oracle11.2.0.4,是值得让客户做出升级决策,从Oracle支持的版本…

    2022年6月9日
    79
  • HTTP Header里的Range和Content-Range参数[通俗易懂]

    HTTP Header里的Range和Content-Range参数[通俗易懂]HTTPHeader里的Range和Content-Range参数转自:http://hongjiang.info/http-header-range-and-content-range/这个话题是从实现一个http资源的静态访问引发的。http协议从1.1开始支持获取文件的部分内容,这为并行下载以及断点续传提供了技术支持。它通过在Header里两个参数实现的,客户端发请求时对应的是Ra…

    2022年8月24日
    9
  • mybatis 查询返回List集合、map集合、List<Map>集合[通俗易懂]

    mybatis 查询返回List集合、map集合、List<Map>集合[通俗易懂]主要是加上这一行:resultType=“java.lang.String” <!–查询所有的学生去向–> <selectid=”selectStudentDirection”resultType=”java.lang.String”> SELECTdirectionNamefromwork_direction </select>…

    2022年9月27日
    3
  • windows下使用aspera_vlc windows

    windows下使用aspera_vlc windows资源下载官网资源:https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz环境配置编译环境:Win764位系统VS2015创建一个VS2015项目,应用程序类型使用静态库,注意取消勾选“使用预编译头”;将资源[libiconv-1.16\lib]文件夹下的所有文件,全部复制到第一步创建的工程目录下,并找到config.h….

    2025年5月22日
    3
  • 详解快速排序算法

    详解快速排序算法基本思想本文的思路是以从小到大为例讲的。快速排序的基本思想是任取待排序序列的一个元素作为中心元素(可以用第一个,最后一个,也可以是中间任何一个),习惯将其称为pivot,枢轴元素;将所有比枢

    2022年7月1日
    27
  • 数据库备份一张表

    数据库备份一张表数据库备份表备份方案一:备份createtable[备份名]asselect*from[表名];恢复truncatetableorg_group;insertintoorg_groupselect*from[备份名];说明此种情况适用于,同一个数据库,需要备份某张表。备份方案二:备份oracle用户终端执行:exp[用户名]/[密码]tables=[表一],[表二]file=/home/oracle/table.dmp恢复

    2022年5月14日
    122

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号