oracle定义clob字段,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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle解析CLOB字段可以使用DBMS_LOB包提供的功能。 CLOBOracle数据库一种特殊的数据类型,用于存储大文本数据。在解析CLOB字段时,需要使用DBMS_LOB包的一些过程和函数。 首先,可以使用DBMS_LOB.GETLENGTH函数获取CLOB字段的长度。这个函数返回CLOB字段的字符数。 然后,可以使用DBMS_LOB.SUBSTR函数截取指定长度的CLOB字段的子字符串。这个函数接受两个参数,第一个参数是CLOB字段本身,第二个参数是截取的起始位置,第三个参数是截取的长度。它返回指定长度的子字符串。 另外,可以使用DBMS_LOB.FILEEXISTS函数检查CLOB字段是否关联了外部文件,返回TRUE或FALSE。 如果CLOB字段关联了外部文件,可以使用DBMS_LOB.FILEOPEN函数打开这个文件,然后可以使用DBMS_LOB.READ函数从文件读取数据。 另外,可以使用DBMS_LOB.CREATETEMPORARY函数创建一个临时LOB对象,可以将CLOB字段数据复制到该临时LOB对象,然后可以使用DBMS_LOB.READ函数从临时LOB对象读取数据。 在解析CLOB字段时,需要注意的是,CLOB字段可能存储了非常大的文本数据,所以需要谨慎处理,以避免内存溢出或性能问题。可以使用块大小和缓冲区大小等参数来提高解析CLOB字段的效率。 总之,通过使用DBMS_LOB包提供的函数和过程,我们可以很方便地解析CLOB字段并进行各种操作,例如获取长度、截取子字符串、读取关联文件等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值