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


转载于:https://my.oschina.net/h2do/blog/309498

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值