Oracle数据库大字段问题
问题描述:字段内容长度超4000
最近项目中存在用某些字段存预处理sql语句,最初,项目此类型字段用varchar2(4000),但随着项目跟进到二期,牵连的表越来越多,存在预处理索引,中间临时表的问题,预处理SQL字段长度超过4000。
oracel默认varchar2类型是不能超过4000的
我们都知道,oracel默认varchar2类型是不能超过4000的,如果类型超过4000的数据插入会自动转为long型数据插入,所以问题来了。
所以我将表中需要超过4000内容的字段该文long型,接下来问题又来了。
oracle一个表中最多只能有一个long型字段
我们又知道,oracle一个表中最多只能有一个long型字段,所以这种解决方案又不适合解决业务需求了,经查询oracle推荐用clob字段类型存储。
这里需要简单普及一下clob和blob的知识:CLOB(Character Large Object) 字符大对象,Blob(Binary Large Object)二进制大对象。
由字面意思可以简单的辨别根据需求选择不同的对应类型,我们项目中这个字段全是文字形式的预处理sql,所以选择了clob,如果在遇到文件、视频、音频等可以选择blob哈。
好吧,既然oracle推荐使用这种clob方式存储超4000的字符内容,那我就选择呗。
接下来问题又来了:这是一种对象存储方式,如何存取呢?
简单的举个栗子吧:
为了使用方便我们肯定要进行数据封装,简单写个类似bean
Class User
Clob sqla;
Clob sqlb;
以及对应的set get方法。
我们在遍历查询结果集ResultSet的时候将对应的结果user.setClob(rs.getClob(“sqla”));
因为我们要用clob里面的内容信息,将Clob转为String使用呗
这就对了塞。在user对象能存储进sqla这个clob对象了吧,是我们就将其取出来用呗,
简单测试一下System.out.println(user.getSqla().toString());
这我们都知道,这打印出来是对象地址对吧。
查询了下怎么将clob转String,我在用的时候将clob转为String使用呗,就查了一下写工具类,方便使用的时候调用
public static String clobToString(CLOB clob) throws SQLException, IOException {
result clob != null ? clob.getSubString(1, (int) clob.length()): null;
}
当jdbc返回给我user对象后我在使用的地方调用clobToString(user.getSqls()),抛出的异常是:连接数据库才能操作。
写了一个stringToClob(String string) 方法返回Clob对象,关键代码如下:
new javax.sql.rowset.serial.SerialClob(s.toCharArray());这就是将字符串变为char数组利用jdbcApi转换。
在使用的地方调用同样报出需要连接数据库才能操作。
所以经研究发现,在jdbc外面String与clob互转是会出错的。
整文的核心:将转换代码在jdbc 操纵是使用。