Oracle 10g 中处理Clob大字段

02:32下午 三月 23, 2006 in category 数据库 by nile black

本文主要讲解
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());
}

Comments[0]

Comments:

Post a Comment:
  • HTML Syntax: NOT allowed