通过JDBC访问oracle数据库的CLOB类型

1.   关于CLOB(Character   Large   Object)
CLOB可用于存放大文本数据,最多可存储4GB数据,在应用开发中比较常见.java提供的sql.Clob类与之对应.它提供两个方法来读取Clob的数据:  
getCharacterStream()   方法返回按unicode编码的输入流(java.io.Reader对象)
getAsciiStream()   方法返回按ASCII编码的输入流(java.io.InputStream对象)
所以如果你的数据库中有可能存储中文字符的话,就要使用前一个方法.
现在举一个实际的例子,让我一步步学习如何使用CLOB.
首先,创建一个含CLOB字段的表:
create   table   test   (id   INTEGER,   content   clob);

接下来,   我们通过JSP往这张表里插入一条记录,然后再获取显示它.
插入操作:  
<%
        Connection   con   =   DriverManager.getConnection(...);   //该行从略
        String   content   =   request.getParameter( "content ");     //大文本数据
        con.setAutoCommit(false);         //*
        String   sql   =   "insert   into   test   values(1,   empty_clob()) ";
        Statement   stmt   =   con.createStatement();
                      stmt.executeUpdate(sql);
       
        con.commit();                         //*
        sql   =   "select   content   from   test   where   id=1   for   update ";
        ResultSet   rs   =   stmt.executeQuery(sql);
        if   (rs.next())   {
                oracle.sql.CLOB   clob   =   (oracle.sql.CLOB)rs.getClob(1);
                clob.putString(1,   content);
                sql   =   "update   test   set   content=?   where   id= "   +   seq;
                PreparedStatement   pstmt       =   con.prepareStatement(sql);
                pstmt.setClob(1,   clob);
                pstmt.executeUpdate();
        }
%>

以上需要注意的几点是:
1)clob类型的数据不能直接insert,要先通过empty_clob()方法给它分配一个locator(同理,blob的用empty_blob()函数分配locator).然后把它select出来(此时它当然没有数据,但结果集不是空的),得到一个Clob的对象,修改该对象的内容让它满足我们的需要,再通过update方法更新该行记录.

2)   通过select修改含lob类型的记录时一定要锁定该行(通过for   update关键字实现),否则oracle会报错.

3)   刚插入的记录就select   for   update,   会出现 "违反读取顺序 "错误,解决办法是将自动提交功能置为false,即不允许自动提交,然后commit它,再select,就可以了.   这就是上面那段代码里//*两行的作用.

下面,我们将刚插入的记录从数据库中读取出来并显示之:
<%        
        String   sql   =   "select   content   from   test   where   doc_id=1 ";
        ResultSet   rs   =   stmt.executeQuery(sql);
        String   content   =   " ";
        if   (rs.next())   {
                oracle.sql.CLOB   clob   =   (oracle.sql.CLOB)rs.getClob( "content ");
                if   (clob   !=   null){                
                        Reader   is   =   clob.getCharacterStream();
                        BufferedReader   br   =   new   BufferedReader(is);
                        String   s   =   br.readLine();
                        while   (s   !=   null)   {
                                content   +=   s   +   " <br> ";
                                s   =   br.readLine();
                        }
                              }
                      out.println(content);
%>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值