java clob 操作_java操作clob字段

java操作clob字段

在oracle数据库中如何插入CLOB值 oracle中最常用的varcher2类型最多只能存储4000个字节的内容,一般情况下是能够满足用户的需求的。但是在一些特殊情况下(如要存储图片或者要存储的内容超过了4000个字节),varcher2就满足不了这个需求了。这个时候我们可以借助于oracle里面的大字段CLOB,后者 BLOB。举例如下: 首先,在数据库中建一张表news,为了简单起见,只有一个字段content(CLOB)。做好准备工作后就可以开始我们的CLOB之旅了。 以下是插入CLOB的代码:

import java.sql.*;

import java.io.*;

public class TestClob{

public void TestClob(){}

public static void main(String args[]){

try{

Class.forName("oracle.jdbc.driver.OracleDriver");

Connectionconn=DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:ora32","tjpt","tjpt");     conn.setAutoCommit(false); //第一步:插入一个空的CLOB

Stringsql1="insert into news(content,id) values (EMPTY_CLOB(),'1')";

PreparedStatementps1=conn.prepareStatement(sql1);

ps1.executeUpdate(); ps1.close(); //第二步:取出该CLOB

Stringsql2="select content from news for update";

PreparedStatementps2=conn.prepareStatement(sql2);

ResultSetrs2=ps2.executeQuery();

while (rs2.next()){

oracle.sql.CLOBclob=(oracle.sql.CLOB)rs2.getClob(1);

BufferedWriterout=newBufferedWriter(clob.getCharacterOutputStream());

Stringcontent="1234";//假定这是新闻的内容,当然可以也可以是其他的内容

out.write(content,0,content.length());

out.close();

}

conn.commit();

} catch(Exception e){e.printStackTrace();}

}

}

既然插入进去了,那我们还得要检验一下:插进去的是不是你想插进去的内容?以下就是读取CLOB的代码: import java.sql.*;

import java.io.*;

public class ReadClob{

public void ReadClob(){}

public static void main(String args[]){

try{

Class.forName("oracle.jdbc.driver.OracleDriver");

Connectionconn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ora32","tjpt","tjpt"); Stringsql1="select content from news";

PreparedStatementps1=conn.prepareStatement(sql1);

ResultSetrs1=ps1.executeQuery();

while (rs1.next()){

oracle.sql.CLOBclob=(oracle.sql.CLOB)rs1.getClob(1);

BufferedReaderin=newBufferedReader(clob.getCharacterStream());

StringWriterout=newStringWriter();

int c;

while((c=in.read())!=-1){

out.write(c);

}

Stringcontent=out.toString();

System.out.println (content);//输出CLOB内容 }

} catch(Exception e){e.printStackTrace();

}

}

}

例题2:插入

//ReportEntity 存放数据的bean

public boolean AddMonth_Report(ReportEntity re) throws Exception {

Connectionconn=null;

Statementst=null;

ResultSetrs=null;

这个sql是先插入空值,占个位子

Stringsql=

"insert into staff_monthform(id,memb_id,m_plan,m_summery,m_date) values"

+ " (SEQ_MID.nextval,'" +   re.getMEMB_ID()+

"',empty_clob(),empty_clob(),sysdate)";

//clob型的字段要先以empty_clob()空值插入;然后用update把数据修改进去

try {

conn=ConnectionPool.getConnection();//连接池

conn.setAutoCommit(false);

st=conn.createStatement();

st.executeUpdate(sql);

//这个sql执行的是update,先将该条记录锁定,再修改数据

Stringsql2="select m_plan from staff_monthform where memb_id='"+

re.getMEMB_ID() + "' "

+

" and   to_char(M_DATE,'mm')=to_char(sysdate,'mm') for update";

rs=st.executeQuery(sql2);

oracle.sql.CLOBclobtt=null;

if (rs.next()) {

try {

oracle.sql.CLOBclob= (oracle.sql.CLOB) rs.getObject(1); //clob

Writeroutstream=clob.getCharacterOutputStream(); //字符 输出流

outstream.write(new String(re.getM_PLAN().getBytes(

"ISO8859_1"))); //写

outstream.close();

} catch (Exception ex) {

ex.printStackTrace();

}

return true;

}

conn.commit();

} catch (Exception ex) {

ex.printStackTrace();

} finally {

try {

if (rs != null) {

rs.close();

}

if (st != null) {

st.close();

}

if (conn != null) {

ConnectionPool.close(conn);

}

} catch (Exception sqlex) {

Logger.error(sqlex.getMessage());

}

}

return false;

}

在s2sh操作clob字段时,更新的时候容易出现这种错误:

不允许的操作: streams type cannot be used in batching

解决方法如下:

近日程序的数据库转为oracle 在操作blob类型时报以下错误:不允许的操作: streams type cannot be used in batching。经过查找多方面的资料查证Oracle JDBC不允许流操作以批量方式执行(Oracle CLOB采用流机制作为数据读写方式)。 只需在spring配置文件中更改hibernate jdbc.batch_size为0即可。

org.hibernate.dialect.Oracle9Dialect

org.hibernate.connection.C3P0ConnectionProvider

true

true

org.hibernate.cache.EhCacheProvider

0

org.hibernate.dialect.Oracle9Dialectorg.hibernate.connection.C3P0ConnectionProvidertruetrueorg.hibernate.cache.EhCacheProvider0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值