国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

通過JDBC操縱Oracle數據庫LOB字段的幾種情況分析

2024-08-29 13:31:10
字體:
來源:轉載
供稿:網友
通過jdbc操縱oracle數據庫lob字段的幾種情況分析縱橫軟件制作中心 雨亦奇2003-6-10 15:14:19
在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 {

/* 插入一個空的clob對象 */

stmt.executeupdate("insert into test_clob values ('111', empty_clob())");

/* 查詢此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對象中寫入數據 */

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 {

/* 查詢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");

/* 進行覆蓋式修改 */

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 {

/* 清空原clob對象 */

stmt.executeupdate("update test_clob set clobcol=empty_clob() where id='111'");

/* 查詢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");

/* 更新數據 */

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);

}



4、clob對象讀取



public static void clobread(string outfile) throws exception

{

/* 設定不自動提交 */

boolean defaultcommit = conn.getautocommit();

conn.setautocommit(false);



try {

/* 查詢clob對象 */

resultset rs = stmt.executequery("select * from test_clob where id='111'");

while (rs.next()) {

/* 獲取clob對象 */

oracle.sql.clob clob = (oracle.sql.clob)rs.getclob("clobcol");

/* 以字符形式輸出 */

bufferedreader in = new bufferedreader(clob.getcharacterstream());

bufferedwriter out = new bufferedwriter(new filewriter(outfile));

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

out.close();

in.close();

}

} catch (exception ex) {

conn.rollback();

throw ex;

}



/* 恢復原提交狀態 */

conn.setautocommit(defaultcommit);

}



二、 blob對象的存取



1、 向數據庫中插入一個新的blob對象



public static void blobinsert(string infile) throws exception

{

/* 設定不自動提交 */

boolean defaultcommit = conn.getautocommit();

conn.setautocommit(false);



try {

/* 插入一個空的blob對象 */

stmt.executeupdate("insert into test_blob values ('222', empty_blob())");

/* 查詢此blob對象并鎖定 */

resultset rs = stmt.executequery("select blobcol from test_blob where id='222' for update");

while (rs.next()) {

/* 取出此blob對象 */

oracle.sql.blob blob = (oracle.sql.blob)rs.getblob("blobcol");

/* 向blob對象中寫入數據 */

bufferedoutputstream out = new bufferedoutputstream(blob.getbinaryoutputstream());

bufferedinputstream in = new bufferedinputstream(new fileinputstream(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、修改blob對象(是在原blob對象基礎上進行覆蓋式的修改)



public static void blobmodify(string infile) throws exception

{

/* 設定不自動提交 */

boolean defaultcommit = conn.getautocommit();

conn.setautocommit(false);



try {

/* 查詢blob對象并鎖定 */

resultset rs = stmt.executequery("select blobcol from test_blob where id='222' for update");

while (rs.next()) {

/* 取出此blob對象 */

oracle.sql.blob blob = (oracle.sql.blob)rs.getblob("blobcol");

/* 向blob對象中寫入數據 */

bufferedoutputstream out = new bufferedoutputstream(blob.getbinaryoutputstream());

bufferedinputstream in = new bufferedinputstream(new fileinputstream(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、替換blob對象(將原blob對象清除,換成一個全新的blob對象)



public static void blobreplace(string infile) throws exception

{

/* 設定不自動提交 */

boolean defaultcommit = conn.getautocommit();

conn.setautocommit(false);



try {

/* 清空原blob對象 */

stmt.executeupdate("update test_blob set blobcol=empty_blob() where id='222'");

/* 查詢此blob對象并鎖定 */

resultset rs = stmt.executequery("select blobcol from test_blob where id='222' for update");

while (rs.next()) {

/* 取出此blob對象 */

oracle.sql.blob blob = (oracle.sql.blob)rs.getblob("blobcol");

/* 向blob對象中寫入數據 */

bufferedoutputstream out = new bufferedoutputstream(blob.getbinaryoutputstream());

bufferedinputstream in = new bufferedinputstream(new fileinputstream(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);

}



4、blob對象讀取



public static void blobread(string outfile) throws exception

{

/* 設定不自動提交 */

boolean defaultcommit = conn.getautocommit();

conn.setautocommit(false);



try {

/* 查詢blob對象 */

resultset rs = stmt.executequery("select blobcol from test_blob where id='222'");

while (rs.next()) {

/* 取出此blob對象 */

oracle.sql.blob blob = (oracle.sql.blob)rs.getblob("blobcol");

/* 以二進制形式輸出 */

bufferedoutputstream out = new bufferedoutputstream(new fileoutputstream(outfile));

bufferedinputstream in = new bufferedinputstream(blob.getbinarystream());

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);

}



觀察上述程序對lob類型字段的存取,我們可以看出,較之其它類型字段,有下面幾個顯著不同的特點:



一是必須取消自動提交。



存取操作開始前,必須用setautocommit(false)取消自動提交。其它類型字段則無此特殊要求。這是因為存取lob類型字段時,通常要進行多次操作可以完成。不這樣的話,oracle將拋出“讀取違反順序”的錯誤。



二是插入方式不同。



lob數據不能象其它類型數據一樣直接插入(insert)。插入前必須先插入一個空的lob對象,clob類型的空對象為empty_clob(),blob類型的空對象為empty_blob()。之后通過select命令查詢得到先前插入的記錄并鎖定,繼而將空對象修改為所要插入的lob對象。



三是修改方式不同。



其它類型的字段修改時,用update … set…命令即可。而lob類型字段,則只能用select … for update命令將記錄查詢出來并鎖定,然后才能修改。且修改也有兩種改法:一是在原數據基礎上的修改(即覆蓋式修改),執行select … for update后再改數據;二是替換(先將原數據清掉,再修改),先執行update命令將lob字段之值設為空的lob對象,然后進行第一種改法。建議使用替換的方法,以實現與其它字段update操作后一樣的效果。



四是存取時應使用由數據庫jdbc驅動程序提供的lob操作類。



對于oracle數據庫,應使用oracle.sql.clob和oracle.sql.blob。不使用由數據庫jdbc驅動程序提供的lob類時,程序運行時易于出現“抽象方法調用”的錯誤,這是因為jdbc所定義的java.sql.clob與java.sql.blob接口,其中的一些方法并未在數據庫廠家提供的驅動程序中真正實現。



五是存取手段與文件操作相仿。



對于blob類型,應用inputstream/outputstream類,此類不進行編碼轉換,逐個字節存取。oracle.sql.blob類相應提供了getbinarystream()和getbinaryoutputstream()兩個方法,前一個方法用于讀取oracle的blob字段,后一個方法用于將數據寫入oracle的blob字段。



對于clob類型,應用reader/writer類,此類進行編碼轉換。oracle.sql.clob類相應提供了getcharacterstream()和getcharacteroutputstream()兩個方法,前一個方法用于讀取oracle的clob字段,后一個方法用于將數據寫入oracle的clob字段。



需要說明的是,為了大幅提高程序執行效率,對blob/clob字段的讀寫操作,應該使用緩沖操作類(帶buffered前綴),即:bufferedinputstream,bufferedoutputstream,bufferedreader,bufferedwriter。例程中全部使用了緩沖操作類。





小結:通過jdbc操縱oracle數據庫的lob字段,不外乎插入、修改、替換、讀取四種方式,掌握起來并不難。在實際操作中要注意上面所說的幾點,結合閱讀例程源程序,用戶會很快明白lob類型字段的使用的,也必將領悟到這種類型字段的妙處!源文件下載>>
(網頁編輯:編程浪子)

商業源碼熱門下載www.html.org.cn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 饶平县| 常宁市| 普兰店市| 息烽县| 县级市| 太康县| 长岛县| 贵阳市| 天门市| 景宁| 丰县| 拜城县| 宜良县| 博乐市| 丘北县| 定日县| 五峰| 朝阳市| 山丹县| 宿州市| 嘉义市| 永泰县| 临颍县| 江津市| 从化市| 翁源县| 青冈县| 远安县| 监利县| 儋州市| 舟曲县| 额敏县| 通许县| 信阳市| 岢岚县| 蒲江县| 宁国市| 三明市| 海晏县| 平果县| 宜兴市|