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