Natural

 

Oracle中插入Clob大字段时的处理

最近一次开发中涉及clob字段的存储。以前没使用过,结果发现它不能像普通的varchar2、date等字段那样存储。上网查询了一下,结果发现有些资料不太准确。最后找了个能用的解决。特此写个demo与大家分享。(PS:测试时用的是Oracle9i)

import java.io.Writer;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.CLOB;

public class Test {

    
/**
     * 更新Clob字段
     * 
@param sourceConn Connection 源数据库的连接词
     * 
@param targetConn Connection 目标数据库的连接词
     
*/
    
public void updateClob(Connection sourceConn, Connection targetConn)
    {
        ResultSet rsSource 
= null;
        ResultSet oracleRS 
= null;
        Connection connTarget 
= null;    // 目标数据库的连接
        Connection connSource = null;    // 源数据库的连接
        PreparedStatement psmtInsert = null;
        PreparedStatement psmtSelect 
= null;
        Statement oracleStmt 
= null;
        
        String sInsertSQL 
= "INSERT INTO tableTarget(id,context) VALUES (?,empty_clob())";
        String sSelectSQL 
= "SELECT context FROM tableSource WHERE id = ? ";
        String sID 
= "1";
        
        connTarget 
= targetConn; // 获取数据库连接
        connSource = sourceConn; // 
        
        
// 查询源数据库中表tableSource的clob字段context
        psmtSelect = connSource.prepareStatement(sSelectSQL);
        psmtSelect.setString(
1, sID);
        psmtSelect.executeQuery();
        rsSource 
= psmtSelect.getResultSet();
        
        
// 将clob字段插入目标数据库中的表tableTarget
        psmtInsert = connTarget.prepareStatement(sInsertSQL);
        connTarget.setAutoCommit(
false);    // 设置为不即时提交,待会后面一起提交
        psmtInsert.setString(1, sID);
        psmtInsert.executeUpdate();
        
        
// 更新CLOB字段
        Clob clobSource = rsSource.getClob("context");    // 源数据库的Clob字段
        String sClob = clobSource.getSubString((long)1, (int)clobSource.length());
        CLOB clobTarget 
= null;            // 目标数据库的字段
        oracleStmt = connTarget.createStatement();
        oracleRS 
= oracleStmt.executeQuery("SELECT context FROM tableTarget  WHERE id = '"+sID+"'");
        
        
// 写入Clob字段
        if(oracleRS.next() && sClob != null)
        {
            clobTarget 
= ((OracleResultSet)oracleRS).getCLOB("context");
            Writer writer 
= clobTarget.getCharacterOutputStream() ;
            writer.write(sClob);
            writer.flush();
            writer.close();
            
            connTarget.commit();    
// 事务提交
        }
    }
    
}


posted on 2009-10-20 10:13 此号已被删 阅读(2851) 评论(0)  编辑  收藏 所属分类: Oracle


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(8)

随笔分类(83)

随笔档案(78)

文章档案(2)

相册

收藏夹(7)

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜