Oracle 10g 中用 setString方法寫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());
}