zoukankan      html  css  js  c++  java
  • 防止Mybatis将list中的字符串类型的数字强制转换成Int类型的方法,数据库报错ORA-01790

    一、背景

    在代码中有一段形如下面的SQL,数据库是Oracle的

    INSERT INTO IPAM.T_SEARCHDETAIL
      (ID,
       UNIQUEPART,
       LOCATIONID,
       PARANAME,
       RESULTSTRING,
       RESULTVALUE,
       RESULTDATE,
       SEARCHNO,
       TYPENO,
       TYPEVAR,
       RESULTSTATE)
      SELECT seq_searchdetail.NEXTVAL, CD.*
        FROM (SELECT '@F01R20D338@00101432@0204@20200923@125348@@',
                     '00000000531500900001100010001',
                     'POS2LeftDistance',
                     null,
                     2.352403,
                     '2020-10-16 00:00:03.454',
                     1145,
                     null                                         TYPENO,
                     null                                         TYPEVAR,
                     null                                         RESULTSTATE
                FROM DUAL
              UNION all
              SELECT '@F01R20D338@00101432@0204@20200923@125348@@',
                     '00000000531500900001100010001',
                     'GlueTimeOut',
                     '0',
                     null,
                     '2020-10-16 00:00:03.454',
                     1145,
                     null                                         TYPENO,
                     null                                         TYPEVAR,
                     null                                         RESULTSTATE
    
    --.........还有大约1000多个union在一起的Selct语句
    FROM DUAL) CD;

      这条语句一般情况下都是正常执行的。因为之前每次执行的时候都满足RESULTSTRING这个字段的数值都是非数字字符串,最近这条SQL一直报ORA-01790

    数据量比较大,调试起来比较困难,每次执行都需要3分钟左右。搞来搞去搞了一个晚上还是无法解决。最后缩小数据比例,加快调试进度。Mybatis用log4j打印在控制台的SQL语句又是参数和值分开的,又给IDEA安装了mybatis  log plugin插件,调试才顺利了一些。最后猜测有可能是字符串类型的数字在select * from dual的时候被转成了数字。

    二、措施

    Mybatis XML配置文件

    <insert id="insertSearchdetailBatch" parameterType="java.util.List" useGeneratedKeys="false">
    	INSERT INTO IPAM.T_SEARCHDETAIL(ID,UNIQUEPART,LOCATIONID,PARANAME,RESULTSTRING,RESULTVALUE,RESULTDATE,SEARCHNO,TYPENO,TYPEVAR,RESULTSTATE)
    		SELECT seq_searchdetail.NEXTVAL,CD.* FROM ( 
    	<foreach collection="list" index="index" item="item" separator="union all">
    		SELECT 
    		 #{item.uniquepart} ,#{item.locationid} ,#{item.paraname} ,#{item.resultstring} ,#{item.resultvalue} ,#{item.resultdate} ,
    		 #{item.searchno} ,#{item.typeno} TYPENO,#{item.typevar} TYPEVAR,#{item.resultstate} RESULTSTATE
    		FROM DUAL
    	</foreach>
    	)CD
    </insert>

    #{item.resultstring} 改成#{item.resultstring,jdbcType=VARCHAR}
    #{item.resultvalue} 改成#{item.resultvalue,jdbcType=FLOAT}
    问题得到解决

    <insert id="insertSearchdetailBatch" parameterType="java.util.List" useGeneratedKeys="false">
    	INSERT INTO IPAM.T_SEARCHDETAIL(ID,UNIQUEPART,LOCATIONID,PARANAME,RESULTSTRING,RESULTVALUE,RESULTDATE,SEARCHNO,TYPENO,TYPEVAR,RESULTSTATE)
    		SELECT seq_searchdetail.NEXTVAL,CD.* FROM ( 
    	<foreach collection="list" index="index" item="item" separator="union all">
    		SELECT 
    		 #{item.uniquepart} ,#{item.locationid} ,#{item.paraname} ,#{item.resultstring,jdbcType=VARCHAR} ,#{item.resultvalue,jdbcType=FLOAT} ,#{item.resultdate} ,
    		 #{item.searchno} ,#{item.typeno} TYPENO,#{item.typevar} TYPEVAR,#{item.resultstate} RESULTSTATE
    		FROM DUAL
    	</foreach>
    	)CD
    </insert>
    

      

  • 相关阅读:
    学习两个Python不常用的语法
    使用uwsgi在centos7上部署Flask在线Web服务
    redis server学习002
    上传至gitlab—— 本地git出现fatal: The current branch develop has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin develop 的问题
    数据库脏数据——数据库中的并发操作带来的一系列问题
    error: failed to push some refs to 'git@github.com:Sirxy/flask_jwt_demo.git'
    redis server学习001
    【解决方案】麒麟v10,更新yum源
    【解决方案】github图片加载不出来
    linux c程序高cpu,排查记录
  • 原文地址:https://www.cnblogs.com/CryOnMyShoulder/p/13826339.html
Copyright © 2011-2022 走看看