varchar2改成clob帶來的問題

jdbc的PreparedStatement.setString(),ResultSet.getString()對clob和string的處理同樣,儘管類型變化了但程序修改相對較少(前端長度驗證)。前端

做爲基礎數據,須要將開發庫表數據導出經過sql方式在正式環境進行升級,clob字段沒法正常導出sql,若是clob字段小於4000可經過to_char轉換導出,字段大於4000時insert語句執行將有異常「ORA-01704: string literal too long」。再若是隻是存在極個別大於4000,還能夠有一個方法,經過先insert前4000,再逐個update(set remark = remark + 'xxx'),若是量比較大處理起來就比較費力,考慮如下處理方法:java

一、在庫中增長varchar2(4000)列,做爲基礎數據長度仍是可控的;sql

二、bean增長set和get方法,set方法進行超長拆分,get方法進行超長拼接;數據庫

/**備註*/
private String remark;
/**擴展備註*/
private String remark1;

/**拼接備註,無實際數據庫字段,無實際bean屬性*/
public String getRealRemark() {
    return null == remark ? null : remark + (null == remark1 ? "" : remark1);
}

/**拆分備註*/
public void setRealRemark(String realRemark) throws UnsupportedEncodingException
{
    if (null == realRemark || realRemark.getBytes("GBK").length <= 4000) {
        /*未超4千字節,remark1列無用*/
        
        this.remark  = realRemark;
        this.remark1 = null;
    } else if(realRemark.getBytes("GBK").length <= 7997){
        /*超過4千字節,remark列存不超4千字節的最多字符*/
        
        int len = 2000;
        while (true) {
            if (realRemark.substring(0, ++len).getBytes("GBK").length > 4000) {
                //TODO:優化
                break;
            }
        }
        
        this.remark  = realRemark.substring(0, len - 1);
        this.remark1 = realRemark.substring(len - 1);
    }else{
        
    }
}

public String getRemark() {
    return remark;
}
public void setRemark(String remark) {
    this.remark = remark;
}
public String getRemark1() {
    return remark1;
}
public void setRemark1(String remark1) {
    this.remark1 = remark1;
}
相關文章
相關標籤/搜索