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

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

时间: 2024-10-02 16:24:49

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

clob-请问PHP如何读取Oracle数据库中的CLOB字段?

问题描述 请问PHP如何读取Oracle数据库中的CLOB字段? 请问PHP如何读取Oracle数据库中的CLOB字段?数据库中CLOB字段中是文本内容. 试了N多次,都没用,还望各位大神不吝赐教,感谢!

Oracle数据库中SQL语句的优化技巧_oracle

在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.

Oracle数据库中 call 和 exec的区别_oracle

今天发现了一个小东西,觉得很有意思,查找了一些资料,跟大家分享一下: 在sqlplus中: 在第三方提供的工具(如:plsqldev) 总结: exec是sqlplus的命令,只能在sqlplus中使用. call是sql命令,任何工具都可以使用,call必须有括号,即例没有参数 call必须有括号,即例没有参数 idle> connect /as sysdba 已连接. sys@PO10> sys@PO10> create procedure p_test is 2 begin 3 n

快速查出Oracle数据库中锁等待的方法_oracle

通常在大型数据库系统中,为了保证数据的一致性,在对数据库中的数据进行操作时,系统会进行对数据相应的锁定. 这些锁定中有"只读锁"."排它锁","共享排它锁"等多种类型,而且每种类型又有"行级锁"(一次锁住一条记录),"页级锁"(一次锁住一页,即数据库中存储记录的最小可分配单元),"表级锁"(锁住整个表).若为"行级排它锁",则除被锁住的该行外,该表中其它行均可被其它的

Oracle数据库升级或数据迁移方法研究_oracle

一.数据库升级的必要性 数据库升级是数据库管理员经常要面对的问题,如果你的应用要使用新版本数据库的新特性:如果数据库运行负载过重,而通过软硬件调整又不能有根本性的改善:如果要更换操作系统平台:如果要增强数据库的安全性:还有一个原因是随着新版本数据库的出现与成熟,oracle停止了对旧版本数据库的技术支持,升级到高版本,可以继续获得oracle的支持,还可以利用新版本数据库的新特新,可以改善系统的性能,健壮性,可扩张性和可用性,等等,面对这些问题,需要通过数据库升级才得以解决.不过,如果你的系统运

整理Oracle数据库中数据查询优化的一些关键点_oracle

数据库最基本的任务是存储.管理数据,而终端用户唯一能看到的数据库特性就是其性能:数据库以何速度处理某一指定查询的结果,并且将结果返回到用户所用的工具和应用程序.从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大.查阅新闻. 查看文件. 查询统计信息等.因此,数据库查询操作的效率是影响一个应用系统响应时间的关键因素.随着一个应用系统中数据的动态增长,数据量变大,数据库查询效率就会有所降低,应用系统的响应速度也随之减慢,尤其对于海量数据的管理和查询问题就更加突出,Oracle查询

使用java操作Oracle数据库中的CLOB数据类型

字段类型:blob,clob,nclob 说明:三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频.视频等非文本文件,最大长度是4GB.LOB有几种类型,取决于你使用的字节的类型,Oracle 8i实实在在地将这些数据存储在数据库内部保存.可以执行我们所操作的clobtest_table中属性是(字符型id,CLOB型picstr),目前我们假设一个大的字符对象str已经包含了我们需要存入picstr字段的数据.而且connection

hibernate-Oracle数据库中新增一个字段,Hibernate中映射怎样加?

问题描述 Oracle数据库中新增一个字段,Hibernate中映射怎样加? 问题:我在oracle数据库中新增一个字段,那么在Hibernate映射中,需要手动加进去吗?在中. 谢谢!! 解决方案 类似这样,第一个name对应实体中,第二个name对应数据库 解决方案二:

如何处理Oracle数据库中的坏块问题

oracle|数据|数据库|问题   本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了.   一:什么是数据库的坏块   首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction laye