首页 > 代码库 > varchar2改为clob带来的问题
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; }
varchar2改为clob带来的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。