在java 中读取 Oralce Clob类型

9116 2004-08-23 07:21:17
我先在表中插入了一个记录:

insert into webadmin.Hospital values(1,'QQQ',empty_clob(),empty_clob(),empty_clob(),'6',empty_clob(),empty_clob(),empty_clob(),empty_clob(),empty_clob(),'1',empty_clob());



然后要更新这个记录;但是不行;以下是程序代码:

public boolean Update ( String cnt , String mdu )
{
debug.log ( "getContent" , "T-0 params cnt="+cnt+";mdu="+mdu);
try
{
debug.log ( "getContent" , "T-1" );
String sql = "insert into " + skm + ".Hospital values(1,'医院',empty_clob(),empty_clob(),empty_clob(),'6',empty_clob(),empty_clob(),empty_clob(),empty_clob(),empty_clob(),'1',empty_clob())";
Statement stmt = conn.createStatement ();
//ResultSet rs = stmt.executeQuery ( sql );
debug.log ( "getContent" , "T-2" );
String sqll = "select * from "+ skm + ".Hospital where id=1 ";//for update";
ResultSet rss = stmt.executeQuery ( sqll );
debug.log ( "getContent" , "T-3" );
if ( rss.next () )
{
debug.log ( "getContent" , "T-4 Test Name="+rss.getString("Name") );
CLOB clob = ( ( OracleResultSet ) rss ).getCLOB ( "INTRODUCTION" );
clob.putString ( 1 , "ddddddddddddddddddddddddddddddddddd" );
sql = "update "+ skm + ".Hospital set INTRODUCTION=? where id=1";
debug.log ( "getContent" , "T-5" );
PreparedStatement pstmt = conn.prepareStatement ( sql );
debug.log ( "getContent" , "T-5.1" );
pstmt.setClob ( 1 , clob );
debug.log ( "getContent" , "T-5.2" );
pstmt.executeUpdate ();
debug.log ( "getContent" , "T-6" );
pstmt.close ();
return true;
}
else
{
debug.log ( "getContent" , "T-7" );
return false;
}
} catch ( SQLException ex )
{
debug.log ( "getContent" , "T-8" );
ex.printStackTrace();
return false;
}


//当执行到这句
CLOB clob = ( ( OracleResultSet ) rss ).getCLOB ( "INTRODUCTION" );
就出现错误,说未锁顶含有LOB值的行,请问是什么原因? 有哪位高手可以告诉我Clob数据是如何更新的,万分感谢。

哦,还有如果把:
String sqll = "select * from "+ skm + ".Hospital where id=1 ";//for update";
该成
String sqll = "select * from "+ skm + ".Hospital where id=1 for update";
还会有错误:错误的读取顺序;不知道是怎么回事情? 因为我是按照网上的资料写的;请高手指点哦



...全文
314 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongBow007 2004-12-02
  • 打赏
  • 举报
回复
up
追求自由 2004-12-02
  • 打赏
  • 举报
回复
不知道解决了没有?
红楼梦魇 2004-12-02
  • 打赏
  • 举报
回复
haigang(零下一度)说得非常清楚了
haigang 2004-11-26
  • 打赏
  • 举报
回复
转贴
========================
-------------------------------------------------------
有关oracle字段类型的相关信息可以查阅oracle技术网。下面摘抄一些有关blob.clob等类型的说明。又便于大家的了解。
字段类型:blob,clob,nclob
说明:三种大型对象(LOB),用来保存较大的图形文件或带格式的文本文件,如Miceosoft Word文档,以及音频、视频等非文本文件,最大长度是4GB。LOB有几种类型,取决于你使用的字节的类型,Oracle 8i实实在在地将这些数据存储在数据库内部保存。可以执行读取、存储、写入等特殊操作。

我们所操作的clobtest_table中属性是(字符型id,CLOB型picstr),目前我们假设一个大的字符对象str已经包含了我们需要存入picstr字段的数据。而且connection对象conn已经建立。以下的例子程序也因为不想占用太多的空间,所以对抛出异常没有写。大家参考一下api doc。就可以知道该抛出什么异常了,此处仅仅告诉大家如何去写。

代码:


(1)对数据库clob型执行插入操作
*************************************************

java.sql.PreparedStatement pstmt = null;
ResultSet rs = null;
String query = "";

conn.setAutoCommit(false);
query = "insert into clobtest_table(id,picstr) values(?,empty_clob())";
java.sql.PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1,"001");
pstmt.executeUpdate();
pstmt = null
query = "select picstr from clobtest_table where id = '001' for update";
pstmt = con.prepareStatement(query)
rs= pstmt.executeQuery();

oracle.sql.CLOB clobtt = null;
if(rs.next()){
clobtt = (oracle.sql.CLOB)rs.getClob(1);
}
Writer wr = clobtt.getCharacterOutputStream();
wr.write(strtmp);
wr.flush();
wr.close();
rs.close();
con.commit();



(2)通过sql/plus查询是否已经成功插入数据库
*************************************************

PL/SQL的包DBMS_LOB来处理LOB数据。察看刚才的插入是否成功。使用DBMS_LOB包的getlength这个procedure来检测是否已经将str存入到picstr字段中了。如:

SQL> select dbms_lob.getlength(picstr) from clobtest_table;


(3)对数据库clob型执行读取操作
*************************************************

读取相对插入就很简单了。基本步骤和一半的取数据库数据没有太大的差别。
String description = ""
query = "select picstr from clobtest_table where id = '001'";
pstmt = con.prepareStatement(query);
ResultSet result = pstmt.executeQuery();
if(result.next()){
oracle.jdbc.driver.OracleResultSet ors =
(oracle.jdbc.driver.OracleResultSet)result;
oracle.sql.CLOB clobtmp = (oracle.sql.CLOB) ors.getClob(1);

if(clobtmp==null || clobtmp.length()==0){
System.out.println("======CLOB对象为空 ");
description = "";
}else{
description=clobtmp.getSubString((long)1,(int)clobtmp.length());
System.out.println("======字符串形式 "+description);
}
}


icystone 2004-08-23
  • 打赏
  • 举报
回复
这么经典的问题应该先搜索一下:
http://dev.csdn.net/develop/article/18/18955.shtm
constantine 2004-08-23
  • 打赏
  • 举报
回复
up
draco2002 2004-08-23
  • 打赏
  • 举报
回复
没做过,不过可以参考以下:

http://www.newer.com.cn/newer/bbs/post.asp?method=EditTopic&REPLY_ID=5270&topic_id=5270&forum_id=19&cat_id=11&auth=64

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧