昨天在项目中有一个操作数据库的方法抛出一个异常"仅可以为插入 LONG 列的 LONG 值赋值"
上网搜说是数据库字段定义为VARCHAR2()时,如果插入字符界于1000~2000的时候就会发生这个异常,处理方式总结有如下几个:
1.将数据拆分成多个字段来存储.
2.换一个oracle驱动(如将classes12.jar换成ojdbc14.jar),试过了好像没用
3.将字段类型改为CLOB
没办法,只好选择第三种,上网查了些操作CLOB对象的资料,如下:
建表sql:
-- Create table T_CLOBTEST
CREATE TABLE T_CLOBTEST
(
ID VARCHAR2(20),
CLOBCOLUMN CLOB
);
-- Add comments to the columns
comment on column T_CLOBTEST.ID is '流水号';
comment on column T_CLOBTEST.CLOBCOLUMN is 'Clob字段';
----------------------------------------------------------------------------------------------------------------------------------
数据库表的对象:
public class ClobEntity {
private String id = "";
private String clobColumn = "";
public String getClobColumn() {
return clobColumn;
}
public void setClobColumn(String clobColumn) {
this.clobColumn = clobColumn;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
---------------------------------------------------------------------------------------------------------------------------------
数据库操作类代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.sql.CLOB;
import com.baosight.demo.entity.ClobEntity;
import com.baosight.demo.util.DBUtil;
public class ClobTestDAO {
/**
* @param args
*/
public static void main(String[] args) {
/*ClobEntity clobEntity = new ClobEntity();
clobEntity.setId("1");
new ClobTestDAO().insert(clobEntity);*/
new ClobTestDAO().queryById("1", "f:/fjdaljf.java");
}
/**
* 新增记录
* @param ClobEntity
*/
public void insert(ClobEntity clobEntity) {
try {
//获取数据库操作句柄
Connection conn = new DBUtil().getConn();
//设为不自动提交
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
//先初始化CLOB字段,此处为必须的操作,否则后面会产生空指针异常
String initSql = "INSERT INTO T_CLOBTEST VALUES('" + clobEntity.getId() + "', EMPTY_CLOB())";
//读取CLOB字段
String updateSql = "SELECT CLOBCOLUMN FROM T_CLOBTEST WHERE ID = '" + clobEntity.getId() + "'";
stmt.executeUpdate(initSql);
ResultSet rs = stmt.executeQuery(updateSql);
if (rs.next()) {
CLOB clob = (CLOB) rs.getClob(1); //获取CLOB字段内容并转换为 oracle.sql.CLOB类型
//获取CLOB的输出流
Writer os = clob.getCharacterOutputStream();
String insertValue = clobEntity.getClobColumn();
os.write(insertValue);
os.flush();
os.close();
conn.commit();
conn.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 根据ID读取(CLOB)数据,生成到指定硬盘目录下
* @param String
*/
public void queryById(String id, String filePath) {
try {
Connection conn = new DBUtil().getConn();
conn.setAutoCommit(false);
Statement st = conn.createStatement();
PreparedStatement preparedStatement = conn.prepareStatement("SELECT CLOBCOLUMN FROM T_CLOBTEST WHERE ID = '" + id + "'");
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
//获取CLOB字段信息
CLOB clob = (CLOB)rs.getClob("CLOBCOLUMN");
BufferedReader br = new BufferedReader(clob.getCharacterStream());
//创建输出流
BufferedWriter out = new BufferedWriter(new FileWriter(filePath));
String line = br.readLine();
while (line != null) {
//往目录文件中写出数据
out.write(line);
System.out.println(line);
line = br.readLine();
out.flush();
}
out.close();
br.close();
}
rs.close();
st.close();
conn.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
用到的包:classes12.jar