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>