Oracle数据库大字段问题

来源:互联网 发布:网络型组织结构优缺点 编辑:程序博客网 时间:2024/04/30 10:42

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 操纵是使用。
0 0
原创粉丝点击