Oracle 10g 中处理Clob大字段
1、在Oracle 10g中的新的,方便处理Clob 大字段的 JDBC Api
2、以及一个java 中处理大字段的一个示例程序
A、什么是Clob
LOBs (Large Ojbects) 用来存储没有结构的数据,比如大文本内容,图像文件,或是视频等等。
·Oracle里有3种LOB,BLOB(Binary LOB),CLOB(Character LOB),和NCLOB(National Character LOB).
·每一个LOB对象会存储成为一个系统文件,被称为BFILEs.
B、处理Clob
在10g之前Oracle 提供了从java.sql.CLOB扩展的oracle.sql.CLOB对象来处理。从10g以后Oracle的jdbc加入了新的API,OraclePreparedStatement增加了新的Api.OraclePreparedStatement.setStringForClob(),这个方法没有
OraclePreparedStatement.setString()这个方法的32765的长度限制。正如你想象的一样,OraclePreparedStatement.getString(),这个方法照旧,还是一样可以从CLOB字段取得完整的内容。
C、示例程序
方法一:标准的jdbc api
注意,前边提到的 setStringForClob 方法,在标准的 jdbc Api 里面是没有,这里需要把一个 SetBigStringTryClob 属性设置到数据库连接,这样setString()这个方法就会试图用CLOB方式来处setString.
a、准备数据库
CREATE TABLE clob_tab (clob_col CLOB);
b、创建数据库连接
import java.sql.Connection;
import java.sql.DriverManager;
import oracle.jdbc.OracleDriver;
import java.util.Properties;
..........
// 定义数据库连接变量
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "tiger";
// 准备创建数据库连接的属性
Properties props = new Properties();
props.put("user", user );
props.put("password", password);
props.put("SetBigStringTryClob", "true");
//注意,这是有必要的
// 加载数据库驱动
DriverManager.registerDriver(new OracleDriver());
// 获得数据库连接
Connection conn = DriverManager.getConnection( this.url, this.props );
c、小试:
PreparedStatement pstmt = conn.prepareStatement(
"INSERT INTO clob_tab VALUES(?)");
//读入大文本
String str = this.readFile("bigFile.txt");
//用setString方法来把大文本写入Clob字段
//要确保在 SetBigStringTryClob 属性已经设置
pstmt.setString(1, str);
pstmt.executeUpdate();
方法二:非jdbc标准,Oracle api方式
import java.sql.*;
import java.io.*;
import java.util.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.*;
..........
// sql
String sql = "INSERT INTO clob_tab VALUES(?)";
// 读入大文本(大于 32765 字节).
//readFile() 只是一个方法用来读取文本,返回字符串
String str = this.readFile("bigFile.txt");
// 新建 OraclePreparedStatement , 注意比较这里
opstmt = (OraclePreparedStatement)conn.prepareStatement(sql);
// 调用 setStringForClob 方法来写入Clob
opstmt.setStringForClob(1,str);
// 执行
opstmt.executeUpdate();
...........
D、用getString()读取Clob
ResultSet.getString()方法并没有 32765 字节的限制,以下就是读取CLOB字段的方法
.....
PreparedStatement pstmt = null;
ResultSet rset = null;
.......
// 执行Sql,返回结果集
String sqlCall = "SELECT clob_col FROM clob_tab";
pstmt= conn.prepareStatement(sqlCall);
rset = pstmt.executeQuery();
String clobVal = null;
// 读取CLOB字段
while (rset.next()) {
clobVal = rset.getString(1);
System.out.println("CLOB length: "+clobVal.length());
}