mybatis+oracle操作clob类型的数据


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>

 


免责声明!

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



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