oracle数据库中如何处理clob字段方法介绍

在知识库的建立的时候,用普通varchar2存放文章是显然不够的,只有区区4000的字节,放不了多少字,

而clob数据类型,则能最多存放8g的数据。但是这个字段处理起来有比较多的特殊性,记录一下。

插入:

直接写在sql里面是不行的,一来sql脚本有字符数限制,而来文章内容包含许多特殊字符,如换行,引号,

之类的东西,很麻烦。网上流行通用做法是先插入一个空clob字段,用empty_clob()方法来创建空字段,如:


复制代码 代码如下:

insert into t_topic(topic_id,topic_content) values(‘0000001′,empty_clob());

然后再用select topic_content from t_topic where topic_id=’0000001’for update的查询语句,

来构造一个更新的statement,在获取到resultset之后,对clob字段进行更新。


复制代码 代码如下:

resultset rs = pstm.executequery();

if(rs.next()){

oracle.sql.clob lob =(clob)rs.getclob(1);

try {

writer os = lob.getcharacteroutputstream();

os.write(dr.getfield(“fld_content”).asstring());

os.flush();

} catch (ioexception e) {

e.printstacktrace();

}

}

这个插入和更新操作要放在事务中,即获取到connection后要设置setautocommit(false);

更新:

更新的时候也是采用seelct … for update方式

也要设置事务

读取:


复制代码 代码如下:

clob clob = (clob)rs.getclob(“fld_content”);

reader reader = clob.getcharacterstream();

stringbuffer sb=new stringbuffer();

char[] cb = new char[1024];

try {

for(int len = reader.read(cb);len>0;len= reader.read(cb)){

sb.append(cb,0,len);

}

} catch (ioexception e) {

throw new sqlexception(“读取文章内容失败.”,e);

}

查询的特殊性:

有clob字段的数据表,在sql语句中不能使用distinct关键字进行筛选,即便关键字不用在clob字段名前,

实际上distinct关键字都是对于sql中所有字段有效。而clob字段是不能进行如同like类似的匹配的,所以,

不能进行去重复操作。

两种解决办法:

1、在sql中调用方法转成varchar2字段后,再distinct,这种方式的局限显而易见。

2、改变sql脚本的书写方式,先查出没有clob字段的集合,然后在在外层用exists关键字或in关键字进行筛选。


复制代码 代码如下:

//string sqlsel2 = “select jsonbody from db_ps_listcatalog where” +

// ” listtype =’sh11′ for update”;

// string col=”jsonbody”;

public boolean updateclob(string sql,string col,string buf){

boolean flag=false;

statement stem=null;

connection conn=null;

resultset rs=null;

writer wr = null;

try{

conn= dp.getconnection();

conn.setautocommit(false);

stem=conn.createstatement();

rs = stem.executequery(sql);

if (rs.next()) {

clob clob = (clob) rs.getclob(col);

java.lang.reflect.method methodtoinvoke = clob.getclass().getmethod(

“getcharacteroutputstream”, (class[]) null);

wr = (writer) methodtoinvoke.invoke(clob, (object[]) null);

bufferedwriter bw = new bufferedwriter(wr);

bw.write(buf);

bw.flush();

bw.close();

conn.commit();

conn.close();

}

flag=true;

} catch (exception ex){

try {

conn.rollback();

} catch (sqlexception e) {

e.printstacktrace();

}

}

return flag;

}

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐