oracle數據庫允許的clob數據類型最大為4000bit,而對於一些公告,文章類的數據很容易的就會超出oracle所允許的最大長度,超出后后oracle直接報錯,故操作時需要先將大數據分段,第一段插入,后續的端分批更新操作。
1 public void insertClob(List<Report> ReportList){ 2 Map<String, String> reportMap = new HashMap<>(); 3 for (Report report : reportList) { 4 String reportText = report.getReportText(); 5 if (reportText.length() > 1000) { 6 //截串,分段存儲 7 String bgnReportText = reportText.substring(0, 1000); 8 String endReportText = reportText.substring(1000); 9 reportMap.put(report.getId(), endReportText); 10 report.setReportText(bgnReportText); 11 } 12 } 13 if (reportList != null && reportList.size() > 0) { 14 //批量插入數據 15 reportMapper.insertBatch(fundReportList); 16 //分段更新 17 updateReportTextSeg(reportMap); 18 } 19 }
private void updateReportTextSeg(Map<String, String> reportMap) { List<ReportTextObj> list = new ArrayList(); if (reportMap != null) { for (Map.Entry<String, String> entry : reportMap.entrySet()) { ReportTextObj reportTextObj = new ReportTextObj(); //文本數據段 List<String> textSegList = new ArrayList<>(); //公告標識 reportTextObj.setId(entry.getKey()); //處理文本段 每個文本段1000個字符放入textSegList中 String reportText = entry.getValue(); String bgnReportTxt = ""; while (reportText != null) { if (reportText.length() >= 1000) { bgnReportTxt = reportText.substring(0, 1000); reportText = reportText.substring(1000); } else { bgnReportTxt = reportText; reportText = null; } textSegList.add(bgnReportTxt); } //處理分好長度的文本段,每次更新n段,超過的則重新執行一條更新語句 int n = 3; List<String> listSeg = new ArrayList(); ReportTextObj obj = new ReportTextObj(); obj.setId(reportTextObj.getId()); for (int i = 1; i <= textSegList.size(); i++) { listSeg.add(textSegList.get(i - 1)); obj.setTextSegList(listSeg); if (i % n == 0) {//分批更新 list.add(obj); listSeg = new ArrayList(); obj = new ReportTextObj(); obj.setId(reportTextObj.getId()); } else if (i == textSegList.size()) { list.add(obj); } } } } reportMapper.updateReportText(list); }
批量更新的mapper文件,注意:里面的sql針對於oracle10g以上的版本
1 <update id="updateReportText" parameterType="java.util.List"> 2 <foreach collection="list" item="item" index="index" separator=";" open="begin" close=";end;"> 3 update REPORT 4 set REPORT_TEXT=(select report_text from REPORT where ID=#{item.id}) 5 <foreach collection="item.textSegList" item="textSeg" index="index1" separator="||" open="||" close=","> 6 #{textSeg} 7 </foreach> 8 CRTDATE=to_char(sysDate,'yyyyMMdd'), 9 CRTTIME=to_char(sysDate,'HH:mm:ss') 10 where 11 ID=#{item.id,jdbcType=VARCHAR} 12 </foreach> 13 </update>