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