今天写了一个小模块,其中需要对一个CLOB字段进行读写,由于之前未用到
这类字段,所以没遇到什么问题,于是就按普通的varchar类型来操作,即按
普通的insert和select来取值,在小于4K的文本时,没有什么问题,当一超过
该数字就开始报错,于是到网上查找原因:发现需要先往CLOB字段里面插入一个
空的CLOB值,即empty_clob,然后再取出并赋予新的文本,再予以更新:
相关案例代码如下:
以下代码引自(tomcat连接池中解决clob字段的问题 ):
http://blog.csdn.net/guaxixi627/archive/2007/08/02/1722755.aspx
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);
//如果用的是tomcat连接池此处使用
//oracle.sql.CLOB clob = (CLOB) ((org.apache.commons.dbcp.DelegatingResultSet)rs).getClob("CONTENT");
clob.putString(1, content);
sql = "update test set content=? where id=" + seq;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setClob(1, clob);
pstmt.executeUpdate();
end 引用结束
于是我就按照上面的来改,可我在oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(1); 这一句始终都报
ClassCastException错误,我用的是Tomcat连接池,即使按照
oracle.sql.CLOB clob = (CLOB) ((org.apache.commons.dbcp.DelegatingResultSet)rs).getClob("CONTENT");
也一样 报错(org.apache.commons.dbcp.DelegatingResultSet需要引用commons.pool.jar和commons.dbcp.jar这两个包)
网上说一定要使用
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.CLOB;
我的也确实是这样引用的,可依然报错,经过调试发现是java.sql.ResultSet无法转化为OracleResultSet,于是又去网上找:
终于发现原来是DBConnection的类型不对,如果要将java.sql.ResultSet转化为OracleResultSet,这个所依靠的Connection必须
要由OracleDataSource来返回的Connection才行,于是按照下面的这篇文章来做:
以下文章转自:http://topic.csdn.net/u/20070315/21/2ac06a1e-963a-419f-b38d-961fb1a6bfc8.html?75999205
需要用OracleDataSource代替DataSource,否则强制类型转换会出错。用法如下:
import oracle.jdbc.pool.*;
OracleDataSource ds = new OracleDataSource();
ds.setDriverType("thin");
ds.setServerName("dssw2k01");
ds.setPortNumber(1521);
ds.setDatabaseName("orcl"); // sid
ds.setUser("scott");
ds.setPassword("tiger");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO FUJIAN (NUM_ID,BFILE) VALUES("+numid+",EMPTY_BLOB())"); //增加空的BLOB
ResultSet myResultSet=stmt.executeQuery("SELECT BFILE FROM FUJIAN WHERE NUM_ID="+numid+" FOR UPDATE");//锁定更新BLOB
myResultSet.next();
BLOB myBlob=((OracleResultSet)myResultSet).getBLOB("BFILE");//强制类型转换
无论是CLOB还是BLOB问题解决。
我的开发环境是Tomcat6.0+MyEclipse6.5+Oracel 10G
附两种Connection的获取方法:
//javax.sql.DataSource获取Oracel连接
private Connection getJavaConnection() {
Context context = null;
Connection conn = null;
try {
context = new javax.naming.InitialContext();
DataSource dataSource=null;
dataSource = (DataSource) context.lookup("java:comp/env/TestDataSource");
conn = dataSource.getConnection();
} catch (Exception e) {
CLog.dumpMessage("javax.sql.DataSource 获取数据源ORA-1", e);
}
return conn;
}
//OracleDataSource获取Oracle连接
private Connection getOracleConnection() {
Connection conn = null;
try {
OracleDataSource ds = new OracleDataSource();
ds.setURL("jdbc:oracle:thin:@127.0.0.1:1521:ORCL");
ds.setUser("Test");
ds.setPassword("p123456");
conn = ds.getConnection();
} catch (Exception e) {
CLog.dumpMessage("oracle.jdbc.pool.OracleDataSource 获取数据源ORA-2", e);
}
return conn;
}