亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

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

2024-08-29 13:49:25
字體:
來源:轉載
供稿:網友

   通過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類型字段的使用的,也必將領悟到這種類型字段的妙處!源文件下載>>
(網頁編輯:編程浪子)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜未删减在线观看| 国产精品黄色影片导航在线观看| 日韩av在线天堂网| 国产做受高潮69| 国产一区二区三区毛片| 亚洲欧美一区二区三区久久| 欧美怡红院视频一区二区三区| 日韩高清电影好看的电视剧电影| 亚洲在线观看视频网站| 欧美日韩亚洲成人| 精品亚洲男同gayvideo网站| 日韩精品在线看| 97精品在线观看| 久久久亚洲福利精品午夜| 最新日韩中文字幕| 91精品视频在线| 亚洲第一天堂av| 欧美日韩一区免费| 8050国产精品久久久久久| 久久久av免费| 久久九九有精品国产23| 91精品国产免费久久久久久| 国产成人精品视频在线| 国产精品扒开腿做| 俺去亚洲欧洲欧美日韩| 国产精品成人一区二区三区吃奶| 久久夜色精品国产欧美乱| 日韩av在线免播放器| 亚洲国产中文字幕在线观看| 中文字幕日韩av电影| 国产主播喷水一区二区| 色偷偷av亚洲男人的天堂| 亚洲bt欧美bt日本bt| 国语对白做受69| 国产精品久久久久一区二区| 日韩欧美国产网站| 日韩av最新在线观看| 国产精品久久久精品| 亚洲在线免费视频| 成人黄色免费在线观看| 日韩电影在线观看免费| 亚洲成av人影院在线观看| 亚洲网站视频福利| 欧美黑人性生活视频| 国产亚洲欧美一区| 国产精品h在线观看| 精品国产乱码久久久久酒店| 久久久久久国产精品三级玉女聊斋| 国产精品老女人视频| 色狠狠av一区二区三区香蕉蜜桃| 亚洲最大av在线| 亚洲影院在线看| 欧美激情精品久久久久久黑人| 国产剧情日韩欧美| 亚洲精品91美女久久久久久久| 亚洲人永久免费| 精品久久久久久久久久久久| 5252色成人免费视频| 亚洲影视九九影院在线观看| 日韩资源在线观看| 97av在线视频免费播放| 亚洲伦理中文字幕| 日韩精品电影网| 日韩精品极品在线观看播放免费视频| 久久91精品国产| 精品亚洲精品福利线在观看| 久久成人亚洲精品| 国产mv免费观看入口亚洲| 中文字幕亚洲欧美| 日产精品99久久久久久| 亚州国产精品久久久| 青青在线视频一区二区三区| 日韩av大片在线| 国产xxx69麻豆国语对白| 亚洲激情在线观看| 国产香蕉一区二区三区在线视频| 欧美成人激情视频免费观看| 亚洲国产婷婷香蕉久久久久久| 精品久久久久久久中文字幕| 97视频在线观看亚洲| 91精品国产综合久久香蕉最新版| 97超级碰碰碰| 日韩精品极品在线观看| 成人黄色午夜影院| 国产欧美在线观看| 日本精品久久中文字幕佐佐木| 中文字幕亚洲一区| 日韩av综合网站| 欧美激情视频免费观看| 日韩一级裸体免费视频| 九色精品美女在线| 日本成熟性欧美| 在线看福利67194| 亚洲国产精品成人va在线观看| 久久偷看各类女兵18女厕嘘嘘| 日韩av不卡电影| 亚洲欧美日韩国产成人| www国产精品com| 欧美亚洲第一区| 欧美成人午夜免费视在线看片| 亚洲综合中文字幕在线观看| 久久久女人电视剧免费播放下载| 91精品国产电影| 日韩综合视频在线观看| 亚洲精品色婷婷福利天堂| 亚洲天堂男人天堂| 成人免费黄色网| 九色91av视频| 色偷偷噜噜噜亚洲男人的天堂| 欧美精品18videos性欧| 亚洲性线免费观看视频成熟| 亚洲国产古装精品网站| 日韩av电影免费观看高清| 中文字幕视频一区二区在线有码| 国产亚洲美女久久| 国外成人在线播放| 狠狠综合久久av一区二区小说| 国产精品一二区| 91在线高清免费观看| 日韩大陆毛片av| 疯狂蹂躏欧美一区二区精品| 欧美日韩国产麻豆| 欧美精品videosex牲欧美| 成人黄色片网站| 一本色道久久综合狠狠躁篇怎么玩| 国产精品爱啪在线线免费观看| 韩日精品中文字幕| 成人av在线亚洲| 一区二区在线免费视频| 久久免费国产视频| 国产亚洲精品久久久久久777| 欧美老少做受xxxx高潮| 91精品国产91久久久久久| 国产午夜精品免费一区二区三区| 欧美精品在线观看91| 精品久久中文字幕| 91九色综合久久| 欧美日韩一区二区在线播放| 欧美成人一区二区三区电影| 国内精品一区二区三区四区| 中文字幕亚洲欧美日韩高清| 亚洲肉体裸体xxxx137| 中文字幕精品网| 欧美激情精品久久久久久免费印度| 亚洲欧美日韩精品| 午夜精品一区二区三区在线视频| 久久99国产精品久久久久久久久| 亚洲最大福利视频网| 成人写真福利网| 米奇精品一区二区三区在线观看| 97超视频免费观看| 日韩在线www| 久久国产加勒比精品无码| 国产亚洲日本欧美韩国| 欧美日韩亚洲系列| 亚洲精品电影网站| 中文字幕日韩有码| 在线电影av不卡网址| 国产精品第3页| 黑人狂躁日本妞一区二区三区| www.久久色.com| 亚洲精品一区二区在线| 国产精品99一区| 成人疯狂猛交xxx|