• Oracle 批量增加 / 批量跟新


    在使用oracl过程中踩到好多坑,在此记录,也分享给大家。

    第一:批量插入

    代码一(在为明确表和字段的情况下,动态批量增加):

       @Insert("<script>  " +
                " Insert into ${tableName} ( ${serverColumns} )" +
                " <foreach collection='list' item='item' index='index' separator='UNION ALL'> " +
                "( SELECT ${item} FROM dual)" +
                " </foreach>  "+
                "</script> ")
        int insertBatch(@Param("tableName") String tableName, @Param("serverColumns") String serverColumns, @Param("list") List<String> list);

    代码二(具体演示Mybatis,Mappe.xml中的代码):

      <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="false">
               INSERT INTO RELATION
               (ID,LCC_CODE,CLIENT_CODE,KEY_ID,DICT_ID,REMARK,UPDATE_FLAG,SERVER_CREATE_TIME)
               <foreach collection="list" index="index" item="list" separator=" union all">
                   (SELECT
                   ${list}
                   FROM
                   dual)
               </foreach>
           </insert>

    第二:批量更新

    代码(具体演示Mybatis,Mappe.xml中的代码):

    <update id="updateUserPswdBatch" parameterType="java.util.List">
            <foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
                UPDATE T_HPM_PUBLIC_USER
                <set>
                    <if test="item.password != null">
                        PASSWORD = #{item.password},
                    </if>
                </set>
                where ID = #{item.id}
                <if test='item.idNumber != null and item.idNumber !="" '>
                    AND ID_NUMBER = #{item.idNumber}
                </if>
            </foreach>
        </update>

    单元测试:

    @Test
        public void updateUserPswdBatchTest() {
            List<Map<String, String>> list = new ArrayList<>();
            Map<String, String> map1 = new HashMap<>();
            map1.put("id", "789456");
            map1.put("password", "777777777777777777");
            Map<String, String> map2 = new HashMap<>();
            map2.put("id", "123456");
            map2.put("password", "88888888888888888888");
            Map<String, String> map3 = new HashMap<>();
            map3.put("id", "8563159");
            map3.put("password", "9999999999999999999");
            map3.put("idNumber","530111197111083524");
            list.add(map1);
            list.add(map2);
            list.add(map3);
            int i = userMapper.updateUserPswdBatch(list);
            logger.info("【批量更新获取的结果为】 i={}", i);
        }

    注意一:更新的结果i=-1;但是测试后还是-1.

    百度查了具体原因:

    返回负数,是由于mybatis的defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE、REUSE和BATCH。

    其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update、delete返回的行数

    如果确定要拿到更新条数,defaultExecutorTypes设置成SIMPLE就可以

    说明:

    在项目中把defaultExecutorTypes设置成SIMPLE以后,返回的数据还是-1,拿不到具体执行的条数。

     

    注意二:oracle执行update和insert语句卡住不动的问题

    百度查了具体原因:

    造成这样的情况原因在于你之前执行了update或inert操作但你并没有commit,导致你操作的这条记录被oracle锁住,后面就无法update或insert它了

    解决办法:

    1:可能你是在PLSQL中操作的,commit一下
    2:查询锁定记录:

    SELECT s.sid, s.serial# FROM v$locked_object lo, dba_objects ao, v$session s WHERE ao.object_id = lo.object_id AND lo.session_id = s.sid;

    将查询结果中的数据删除:

    ALTER system KILL session 'SID,serial'

     

     

     
  • 相关阅读:
    [ZJOI2010] 数字计数
    [USACO] 2004 Open MooFest 奶牛集会
    数星星
    [SCOI2011] 糖果
    西瓜种植
    [NOI2018] 归程
    [APIO2012] 派遣
    小K的农场
    妮可妮可妮 [Hash]
    [ZJOI2012] 灾难
  • 原文地址:https://www.cnblogs.com/kaile/p/10170587.html
Copyright © 2020-2023  润新知