现在的位置: 首页 > 数据库 > 正文

Oracle中对clob类型字段的操作

2018年05月16日 数据库 ⁄ 共 2950字 ⁄ 字号 评论关闭

下面这篇文章说的很详细,我再做两点补充说明:
        第一,LOB数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的LOB对象,CLOB类型的空对象为EMPTY_CLOB()BLOB类型的空对象为EMPTY_BLOB()。之后通过SELECT命令查询得到先前插入的记录并锁定,继而将空对象修改为所要插入的LOB对象。
        第二,在插入到更新之间一定要将自动提交设为false否则,再次查找时就不能正确更新,查找时一定要用select XXX from table where id='XXX' for update 如果不加for update会报:“row containing the LOB value is not locked”;如果在插入前没有将自动提交设为false会报“fetch out of sequence ”。注意到以上两点一般就可以顺利插入clob型字段了。

---------------------------------------------------------------------------------------------------------
以下代码和文字是网上搞抄的别人的文章,再此谢过原作者。
----------------------------------------------------------------------------------------------------------

 最近在J2EE的项目中需要使用LOB字段保存文本信息以及图片和文件,到网上搜拉一下,还不少,仔细看拉一下,但都不是很全有的还有错误,经过几天的实践,把问题都解决拉,顺便总结一下,希望对需要的朋友有点参考

LOB中我们用的比较多的主要有两种CLOBBLOB,我们对两种类型分别讨论

1.CLOB是字符型LOB,主要存储文本信息,,最长为4G.,J2EE程序中,比如网页的textarea中的字符信息比较长,Varchar2字段类型不能满足时,我们就得用CLOB数据类型,我们这次项目中就碰到这种情况.现在我们先说说如何存取CLOB字段

现在我要把网页中的textarea元素的信息保存到数据库的CLOB字段中, 我们都知道textarea中的信息当然不能直接保存成CLOB,我们在后台得到的是String类型的

有关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);
    }
}

抱歉!评论已关闭.