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'

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM