方法一:
在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。而LONG、LONG RAW等类型的字段,虽然存储容量也不小(可达2GB),但由于一个表中只能有一个这样类型的字段的限制,现在已很少使用了。
LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。
下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。
先建立如下两个测试用的数据库表,Power Designer PD模型如下:
建表SQL语句为:
CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)
一、 CLOB对象的存取
1、往数据库中插入一个新的CLOB对象
public static void clobInsert(String infile) throws Exception
{
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
while (rs.next()) {
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(infile));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
conn.commit();
} catch (Exception ex) {
conn.rollback();
throw ex;
}
conn.setAutoCommit(defaultCommit);
}
2、修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)
public static void clobModify(String infile) throws Exception
{
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
while (rs.next()) {
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(infile));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
conn.commit();
} catch (Exception ex) {
conn.rollback();
throw ex;
}
conn.setAutoCommit(defaultCommit);
}
3、替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)
public static void clobReplace(String infile) throws Exception
{
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
while (rs.next()) {
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(infile));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
conn.commit();
} catch (Exception ex) {
conn.rollback();
throw ex;
}
conn.setAutoCommit(defaultCommit);
}
方法二:
Oracle中,Varchar2支持的最大字节数为4KB,所以对于某些长字符串的处理,我们需要用CLOB类型的字段,CLOB字段最大支持4GB。
还有其他几种类型:
blob:二进制,如果exe,zip
clob:单字节码,比如一般的文本文件.
nlob:多字节码,如UTF格式的文件.
以下就是对CLOG字段的操作方法,在我们的项目中帮助文档部分用到。
1、首先是写入
2、修改CLOB字段内容
================================================================================================
方法1:
oracle.sql.CLOB clob = (oracle.sql.CLOB) resultSet.getClob("TVALUE"); //初始化
Writer outStream = clob.getCharacterOutputStream(); */
方法二:
oracle.sql.CLOBclob = (oracle.sql.CLOB)resultSet.getClob(1);
Writer write = clob.getCharacterOutputStream();
weblogic+ oracle
weblogic.jdbc.wrapper.Clob clob = (weblogic.jdbc.wrapper.Clob) resultSet.getClob("TVALUE");
writer = ((java.sql.Clob) clob).setCharacterStream(0L);
mysql+Tomcat+weblogic
String sql = "UPDATE "+tableClob.Name+" SET TVALUE=? WHERE TRID="+clobRowId+"";
PreparedStatement pst = conn.prepareStatement(sql);
Reader reader = new StringReader(colValue);
pst.setCharacterStream(1, reader);
int num = pst.executeUpdate();
================================================================================================