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'),如果量比较大处理起来就比较费力,考虑以下处理方法:

1、在库中增加varchar2(4000)列,作为基础数据长度还是可控的;

2、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;
}


你可能感兴趣的:(clob,varchar2(4000),ORA-01704)