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,就可以了!
下面是详细的实例:
- package com.data;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.Statement;
- import oracle.sql.CLOB;
- public class WriteClob {
- /**
- * beckham 2009-12-7 下午09:47:36
- */
- public static void main(String[] args) throws Exception {
- Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
- String url = "jdbc:oracle:thin:@localhost:1521:menhu";
- String user = "zm";
- String password = "zm";
- Connection conn = DriverManager.getConnection(url, user, password);
- //设置手动提交
- conn.setAutoCommit(false);
- Statement sta = null;
- ResultSet rs = null;
- PreparedStatement ps = null;
- StringBuffer sb = new StringBuffer() ;
- //clob字段的内容
- sb.append("aaa").append("/r/n").append("bbbb").append("/r/n").append("ccc") ;
- String sql ="insert into test values(2,empty_clob()) " ;
- sta = conn.createStatement() ;
- sta.executeUpdate(sql) ;
- conn.commit() ;
- //锁定并编辑当前数据
- sql="select cdata from test where id=2 for update" ;
- rs = sta.executeQuery(sql) ;
- if(rs.next()){
- //获取clob对象,此处的clob是oracle.sql.Clob
- CLOB clob = (CLOB)rs.getClob(1) ;
- clob.putString(1, sb.toString()) ;
- //执行更新操作
- sql="update test set cdata=? where id=2" ;
- ps = conn.prepareStatement(sql) ;
- //给clob字段赋值
- ps.setClob(1, clob) ;
- ps.executeQuery() ;
- }
- conn.commit();
- rs.close();
- ps.close();
- sta.close();
- conn.close();
- }
- }