手机
当前位置:查字典教程网 >编程开发 >Oracle教程 >oracle数据库中如何处理clob字段方法介绍
oracle数据库中如何处理clob字段方法介绍
摘要:在知识库的建立的时候,用普通VARCHAR2存放文章是显然不够的,只有区区4000的字节,放不了多少字,而CLOB数据类型,则能最多存放8G...

在知识库的建立的时候,用普通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;

}

【oracle数据库中如何处理clob字段方法介绍】相关文章:

oracle数据库如何导出并重新导入

Oracle中OSFA和数据仓库简介

oracle数据库使用distinct多个字段

Oracle数据块实现原理深入解读

Oracle数据库集复制方法浅议

Oracle数据库的备份与恢复

Oracle 数据表分区的策略

oracle11g创建数据库的方法

oracle中关于flashback闪回的介绍

Oracle 数据库自动存储管理-安装配置

精品推荐
分类导航