首页 > 数据库 >mybatis中oracle的merge语句示例

mybatis中oracle的merge语句示例

时间:2022-11-08 14:44:21浏览次数:41  
标签:TASK item ROUTE 示例 oracle jdbcType mybatis NO ID

merge into 在mybatis mapper.xml中的用法

示例

<update id="mergeTask" parameterType="java.util.List">
        MERGE INTO DM_TASK a
        USING (
        <foreach collection="list" index="index" item="item" open="" close="" separator="union all">
            SELECT
                #{item.ROW_ID, jdbcType=BIGINT} AS ROW_ID,
                CASE WHEN #{item.CREATED_BY, jdbcType=BIGINT} IS NULL THEN -1
                ELSE #{item.CREATED_BY, jdbcType=BIGINT}
                END CREATED_BY,
                CASE WHEN #{item.CREATED_TIME, jdbcType=TIMESTAMP} IS NULL THEN CURRENT_TIMESTAMP
                ELSE TO_TIMESTAMP('${item.CREATED_TIME}', 'syyyy-mm-dd hh24:mi:ss.ff')
                END CREATED_TIME,
                CASE WHEN #{item.LAST_UPD_BY, jdbcType=BIGINT} IS NULL THEN -1
                ELSE #{item.LAST_UPD_BY, jdbcType=BIGINT}
                END LAST_UPD_BY,
                CASE WHEN #{item.LAST_UPD_TIME, jdbcType=TIMESTAMP} IS NULL THEN TO_TIMESTAMP('${item.CREATED_TIME}', 'syyyy-mm-dd hh24:mi:ss.ff')
                ELSE TO_TIMESTAMP('${item.LAST_UPD_TIME}', 'syyyy-mm-dd hh24:mi:ss.ff')
                END LAST_UPD_TIME,
                CASE WHEN #{item.MODIFICATION_NUM, jdbcType=BIGINT} IS NULL THEN 0
                ELSE #{item.MODIFICATION_NUM, jdbcType=BIGINT}
                END MODIFICATION_NUM,
                CASE WHEN #{item.TASK_NO, jdbcType=VARCHAR} IS NULL THEN '0'
                ELSE #{item.TASK_NO, jdbcType=VARCHAR}
                END TASK_NO,
                CASE WHEN #{item.TASK_TYPE, jdbcType=CHAR} IS NULL THEN '0'
                ELSE #{item.TASK_TYPE, jdbcType=VARCHAR}
                END TASK_TYPE,
                #{item.SP_BATCH_NO, jdbcType=VARCHAR} AS SP_BATCH_NO,
                CASE WHEN #{item.ORDER_DATE, jdbcType=DATE} IS NULL THEN NULL
                ELSE TO_TIMESTAMP('${item.ORDER_DATE}', 'syyyy-mm-dd hh24:mi:ss.ff')
                END ORDER_DATE,
                CASE WHEN #{item.DISTRIB_DATE, jdbcType=DATE} IS NULL THEN TO_TIMESTAMP('${item.CREATED_TIME}', 'syyyy-mm-dd hh24:mi:ss.ff')
                ELSE TO_TIMESTAMP('${item.DISTRIB_DATE}', 'syyyy-mm-dd hh24:mi:ss.ff')
                END DISTRIB_DATE,
                #{item.PARENT_TASK_NO, jdbcType=VARCHAR} AS PARENT_TASK_NO,
                #{item.FROM_STATION_ID, jdbcType=BIGINT} AS FROM_STATION_ID,
                #{item.ROUTE_ID, jdbcType=BIGINT} AS ROUTE_ID,
                #{item.ROUTE_CODE, jdbcType=VARCHAR} AS ROUTE_CODE,
                #{item.ROUTE_NAME, jdbcType=VARCHAR} AS ROUTE_NAME,
                #{item.VEHICLE_ID, jdbcType=BIGINT} AS VEHICLE_ID,
                #{item.VEHICLE_SIGN, jdbcType=VARCHAR} AS VEHICLE_SIGN,
                #{item.DRIVER_ID, jdbcType=BIGINT} AS DRIVER_ID,
                #{item.DRIVER_NAME, jdbcType=VARCHAR} AS DRIVER_NAME
            FROM DUAL
        </foreach>
        ) b
        ON (a.TASK_NO = b.TASK_NO)
        WHEN MATCHED THEN UPDATE SET
            a.ROUTE_ID = b.ROUTE_ID,
            a.ROUTE_CODE = b.ROUTE_CODE,
            a.ROUTE_NAME = b.ROUTE_NAME,
            a.VEHICLE_ID = b.VEHICLE_ID,
            a.VEHICLE_SIGN = b.VEHICLE_SIGN,
            a.DRIVER_ID = b.DRIVER_ID,
            a.DRIVER_NAME = b.DRIVER_NAME
        WHEN NOT MATCHED THEN INSERT
            (ROW_ID, CREATED_BY, CREATED_TIME, LAST_UPD_BY, LAST_UPD_TIME, MODIFICATION_NUM,
             TASK_NO, TASK_TYPE, SP_BATCH_NO, ORDER_DATE, DISTRIB_DATE, PARENT_TASK_NO,                          FROM_STATION_ID, ROUTE_ID, ROUTE_CODE, ROUTE_NAME, VEHICLE_ID, VEHICLE_SIGN,                        DRIVER_ID, DRIVER_NAME
            )
        VALUES
            (b.ROW_ID, b.CREATED_BY, b.CREATED_TIME, b.LAST_UPD_BY, b.LAST_UPD_TIME,                            b.MODIFICATION_NUM, b.TASK_NO, b.TASK_TYPE, b.SP_BATCH_NO, b.ORDER_DATE,                            b.DISTRIB_DATE, b.PARENT_TASK_NO, b.FROM_STATION_ID, b.ROUTE_ID, b.ROUTE_CODE,                      b.ROUTE_NAME, b.VEHICLE_ID, b.VEHICLE_SIGN, b.DRIVER_ID, b.DRIVER_NAME
           )
    </update>

1.语法:

merge into 数据库表名 a 
using( 传过来的数据集(此数据集要与数据库表的字段映射上) ) b 
on (a.字段名 = b.字段名 ... 还可以再加条件)
when matched then update set ( a.字段名 = b.字段名, ...... )
when not matched then insert (字段名,......) values ( b.字段名, ...... )

2.说明

(1)示例中传过来的参数是list<map<string,object>>
(2)用foreach循环,循环内用select 查询每一项,用union all连接。
       select #{item.名字,jdbcType=VARCHAR} as 数据库对应的字段名称
              .......
              .......
       from dual

标签:TASK,item,ROUTE,示例,oracle,jdbcType,mybatis,NO,ID
From: https://www.cnblogs.com/Fantasyfzg/p/16869670.html

相关文章

  • Oracle、MySQL等数据库故障处理优质文章分享 | 10月汇总
    墨天轮社区于9月起持续举办【聊聊故障处理那些事儿】DBA专题征文活动,每月进行评优发奖,鼓励大家记录工作中遇到的数据库故障处理过程,不仅用于自我复盘与分析,同时也能帮助其......
  • mybatis-plus动态表名
    场景:当一个业务数据量比较大了,通常都会采用分表分库的方式进行数据存放,但我们通常使用的mybatis-Plus表名是通过注解写死的,当我们想查询不同表明之间的数据1老老实实......
  • Oracle ASM Filter Driver
       OracleASMFilterDriver(asmfd)是oracle12c gi开始提供的一个内核模块位于oracleasmdiskio请求路径之中,asmfd屏蔽任何非oracle产生的io写请求,降低了o......
  • MyBatis查询结果resultType返回值类型详细介绍
    一、返回一般数据类型比如要根据id属性获得数据库中的某个字段值。 mapper接口:     //根据id获得数据库中的username字段的值    StringgetEmpNa......
  • MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy
    一、序言众所周知,MybatisPlus在处理单表DAO操作时非常的方便。在处理多表连接连接查询也有优雅的解决方案。今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询。......
  • spring+mybatis
    1.导入依赖<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency> 2.编写sp......
  • mybatis数据源单一
    1.打包方式jar包1.导入依赖<dependencies><!--Mybatis核心--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</v......
  • 报错'pom.xml' has syntax errors和Unresolved dependency: 'org.mybatis:mybatis:jar
     错误:'pom.xml'hassyntaxerrors解决方法:构建SpringBoot项目时报错:'pom.xml'hassyntaxerrors大概率是pom.xml中出现了语法错误 <dependency>和</dependency>要......
  • mybatis入门
    入门要使用MyBatis,只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。如果使用Maven来构建项目,则需将下面的依赖代码置于pom.xml文件中:<dependency>......
  • mybatis注解开发无法查询中文(这个bug卡了我两周了)
    泪目了,两周了,终于解决了Mapper里面的SQL注解语句  Postman发送请求  查询不到数据,  控制台里面语句正确的,参数是正确的,没有乱码,我把语句从控制台复制到co......