在Oracle中,LOB(Large Object,大型對象)類(lèi)型的字段現在用得越來(lái)越多了。因為這種類(lèi)型的字段,容量大(最多能容納4GB的數據),且一個(gè)表中可以有多個(gè)這種類(lèi)型的字段,很靈活,適用于數據量非常大的業(yè)務(wù)領(lǐng)域(如圖象、檔案等)。而LONG、LONG RAW等類(lèi)型的字段,雖然存儲容量也不?。蛇_2GB),但由于一個(gè)表中只能有一個(gè)這樣類(lèi)型的字段的限制,現在已很少使用了。
LOB類(lèi)型分為BLOB和CLOB兩種:BLOB即二進(jìn)制大型對象(Binary Large Object),適用于存貯非文本的字節流數據(如程序、圖象、影音等)。而CLOB,即字符型大型對象(Character Large Object),則與字符集相關(guān),適于存貯文本型的數據(如歷史檔案、大部頭著(zhù)作等)。
下面以程序實(shí)例說(shuō)明通過(guò)JDBC操縱Oracle數據庫LOB類(lèi)型字段的幾種情況。
先建立如下兩個(gè)測試用的數據庫表,Power Designer PD模型如下:
建表SQL語(yǔ)句為:
CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)
一、 CLOB對象的存取
1、往數據庫中插入一個(gè)新的CLOB對象
public static void clobInsert(String infile) throws Exception
{
/* 設定不自動(dòng)提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 插入一個(gè)空的CLOB對象 */
stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES (’111’, EMPTY_CLOB())");
/* 查詢(xún)此CLOB對象并鎖定 */
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID=’111’ FOR UPDATE");
while (rs.next()) {
/* 取出此CLOB對象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
/* 向CLOB對象中寫(xiě)入數據 */
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;
}
/* 恢復原提交狀態(tài) */
conn.setAutoCommit(defaultCommit);
}
2、修改CLOB對象(是在原CLOB對象基礎上進(jìn)行覆蓋式的修改)
public static void clobModify(String infile) throws Exception
{
/* 設定不自動(dòng)提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 查詢(xún)CLOB對象并鎖定 */
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID=’111’ FOR UPDATE");
while (rs.next()) {
/* 獲取此CLOB對象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
/* 進(jìn)行覆蓋式修改 */
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;
}
/* 恢復原提交狀態(tài) */
conn.setAutoCommit(defaultCommit);
}