mybatis 使用oracle merge into 语句踩坑实录

Posted 和风细雨汪汪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 使用oracle merge into 语句踩坑实录相关的知识,希望对你有一定的参考价值。

由于需求涉及oracle的clob类型字段,在mybatis的mapper xml文件中编写merge into语句时总是失败。

附上错误代码

<insert id="mergeInto">
        <selectKey resultType="java.lang.String" order="BEFORE"
            keyProperty="id">
            SELECT to_char(sysdate,‘yyyymmdd‘)||seq_dr_bcxx.nextval
            AS ID FROM dual
        </selectKey>
        MERGE INTO dr_doc_info doc
        USING (SELECT #{cankwxzwtm} cankwxzwtm,
        #{zz} zz FROM dual) d
        ON (doc.cankwxzwtm = d.cankwxzwtm and doc.zz =
        d.zz)
        WHEN matched THEN
        UPDATE SET doc.MOD_TIME =
        #{modTime},doc.UPD_USER = #{updUser}
        WHEN not matched THEN
        INSERT (
        ID,
        CKWXLX,
        CANKWXBH,
        CANKWXZWTM,
        CANKWXYWTM,
        ZZ,
        DYZZXM,
        DIYZZDW,
        DYZZDZ,
        TXZZDZ,
        TXZZXM,
        TXZZDW,
        KANM,
        YEAR,
        JUAN,
        QI,
        YEMA,
        ZWGJC,
        YWGJC,
        <!-- zhongwzy, YINGWZY, -->
        FUND_TYPE,
        FLH,
        IS_OPEN,
    <!--     CKWXLY, -->
        REG_TIME,
        MOD_TIME,
        MEMO,
        CRT_USER,
        UPD_USER
        )VALUES(
        #{id,jdbcType=VARCHAR},
        #{ckwxlx,jdbcType=VARCHAR},
        #{cankwxbh,jdbcType=VARCHAR},
        #{cankwxzwtm,jdbcType=VARCHAR},
        #{cankwxywtm,jdbcType=VARCHAR},
        #{zz,jdbcType=VARCHAR},
        
        #{dyzzxm,jdbcType=VARCHAR},
        #{diyzzdw,jdbcType=VARCHAR},
        #{dyzzdz,jdbcType=VARCHAR},
        #{txzzdz,jdbcType=VARCHAR},
        #{txzzxm,jdbcType=VARCHAR},
        #{txzzdw,jdbcType=VARCHAR},
        #{kanm,jdbcType=VARCHAR},
        
        #{year,jdbcType=VARCHAR},
        #{juan,jdbcType=VARCHAR},
        #{qi,jdbcType=VARCHAR},
        #{yema,jdbcType=VARCHAR},
        #{zwgjc,jdbcType=VARCHAR},
        #{ywgjc,jdbcType=VARCHAR},
        <!-- #{zhongwzy,jdbcType=CLOB,typeHandler=org.apache.ibatis.type.ClobTypeHandler}, 
            #{yingwzy,jdbcType=CLOB,typeHandler=org.apache.ibatis.type.ClobTypeHandler}, -->
        #{fundType,jdbcType=VARCHAR},
        #{flh,jdbcType=VARCHAR},
        #{isOpen,jdbcType=VARCHAR},
        <!-- #{ckwxly,jdbcType=VARCHAR}, -->
        #{regTime,jdbcType=TIMESTAMP},
        #{modTime,jdbcType=TIMESTAMP},
        #{memo,jdbcType=VARCHAR},
        #{crtUser,jdbcType=VARCHAR},
        #{updUser,jdbcType=VARCHAR}
        )
    </insert>

 

主要有三点问题,

1,clob类型的字段比较 要借助函数 dbms_lob.compare() 。

2,clob字段手写insert入库失败(未解决)。

3,借助存储过程成功了(不想用存储过程)。

以上是关于mybatis 使用oracle merge into 语句踩坑实录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 和 Oracle 在 MyBatis 使用中的区别

使用 MyBatis、H2 和 Oracle 程序进行集成测试

mybatis 批量操作数据

Oracle 使用MERGE INTO 语句更新数据

Oracle(merge)

Oracle中merge into的使用 (转)