亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

通過JDBC操縱Oracle數(shù)據(jù)庫LOB字段的幾種情況分析

瀏覽:4日期:2024-07-06 16:46:49
通過JDBC操縱Oracle數(shù)據(jù)庫LOB字段的幾種情況分析縱橫軟件制作中心 雨亦奇2003-6-10 15:14:19 在Oracle中,LOB(Large Object,大型對象)類型的字段現(xiàn)在用得越來越多了。因為這種類型的字段,容量大(最多能容納4GB的數(shù)據(jù)),且一個表中可以有多個這種類型的字段,很靈活,適用于數(shù)據(jù)量非常大的業(yè)務(wù)領(lǐng)域(如圖象、檔案等)。而LONG、LONG RAW等類型的字段,雖然存儲容量也不小(可達2GB),但由于一個表中只能有一個這樣類型的字段的限制,現(xiàn)在已很少使用了。 LOB類型分為BLOB和CLOB兩種:BLOB即二進制大型對象(Binary Large Object),適用于存貯非文本的字節(jié)流數(shù)據(jù)(如程序、圖象、影音等)。而CLOB,即字符型大型對象(Character Large Object),則與字符集相關(guān),適于存貯文本型的數(shù)據(jù)(如歷史檔案、大部頭著作等)。下面以程序?qū)嵗f明通過JDBC操縱Oracle數(shù)據(jù)庫LOB類型字段的幾種情況。先建立如下兩個測試用的數(shù)據(jù)庫表,Power Designer PD模型如下:建表SQL語句為:CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)一、 CLOB對象的存取1、往數(shù)據(jù)庫中插入一個新的CLOB對象public static void clobInsert(String infile) throws Exception{/* 設(shè)定不自動提交 */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對象中寫入數(shù)據(jù) */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);}2、修改CLOB對象(是在原CLOB對象基礎(chǔ)上進行覆蓋式的修改)public static void clobModify(String infile) throws Exception{/* 設(shè)定不自動提交 */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);} 3、替換CLOB對象(將原CLOB對象清除,換成一個全新的CLOB對象)public static void clobReplace(String infile) throws Exception{/* 設(shè)定不自動提交 */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');/* 更新數(shù)據(jù) */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);}4、CLOB對象讀取public static void clobRead(String outfile) throws Exception{/* 設(shè)定不自動提交 */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);}二、 BLOB對象的存取1、 向數(shù)據(jù)庫中插入一個新的BLOB對象public static void blobInsert(String infile) throws Exception{/* 設(shè)定不自動提交 */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對象中寫入數(shù)據(jù) */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);}2、修改BLOB對象(是在原BLOB對象基礎(chǔ)上進行覆蓋式的修改)public static void blobModify(String infile) throws Exception{/* 設(shè)定不自動提交 */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對象中寫入數(shù)據(jù) */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);}3、替換BLOB對象(將原BLOB對象清除,換成一個全新的BLOB對象)public static void blobReplace(String infile) throws Exception{/* 設(shè)定不自動提交 */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對象中寫入數(shù)據(jù) */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);}4、BLOB對象讀取public static void blobRead(String outfile) throws Exception{/* 設(shè)定不自動提交 */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;}/* 恢復(fù)原提交狀態(tài) */conn.setAutoCommit(defaultCommit);}觀察上述程序?qū)OB類型字段的存取,我們可以看出,較之其它類型字段,有下面幾個顯著不同的特點:一是必須取消自動提交。 存取操作開始前,必須用setAutoCommit(false)取消自動提交。其它類型字段則無此非凡要求。這是因為存取LOB類型字段時,通常要進行多次操作可以完成。不這樣的話,Oracle將拋出“讀取違反順序”的錯誤。二是插入方式不同。LOB數(shù)據(jù)不能象其它類型數(shù)據(jù)一樣直接插入(INSERT)。插入前必須先插入一個空的LOB對象,CLOB類型的空對象為EMPTY_CLOB(),BLOB類型的空對象為EMPTY_BLOB()。之后通過SELECT命令查詢得到先前插入的記錄并鎖定,繼而將空對象修改為所要插入的LOB對象。三是修改方式不同。其它類型的字段修改時,用UPDATE … SET…命令即可。而LOB類型字段,則只能用SELECT … FOR UPDATE命令將記錄查詢出來并鎖定,然后才能修改。且修改也有兩種改法:一是在原數(shù)據(jù)基礎(chǔ)上的修改(即覆蓋式修改),執(zhí)行SELECT … FOR UPDATE后再改數(shù)據(jù);二是替換(先將原數(shù)據(jù)清掉,再修改),先執(zhí)行UPDATE命令將LOB字段之值設(shè)為空的LOB對象,然后進行第一種改法。建議使用替換的方法,以實現(xiàn)與其它字段UPDATE操作后一樣的效果。四是存取時應(yīng)使用由數(shù)據(jù)庫JDBC驅(qū)動程序提供的LOB操作類。對于Oracle數(shù)據(jù)庫,應(yīng)使用oracle.sql.CLOB和oracle.sql.BLOB。不使用由數(shù)據(jù)庫JDBC驅(qū)動程序提供的LOB類時,程序運行時易于出現(xiàn)“抽象方法調(diào)用”的錯誤,這是因為JDBC所定義的Java.sql.Clob與java.sql.Blob接口,其中的一些方法并未在數(shù)據(jù)庫廠家提供的驅(qū)動程序中真正實現(xiàn)。五是存取手段與文件操作相仿。對于BLOB類型,應(yīng)用InputStream/OutputStream類,此類不進行編碼轉(zhuǎn)換,逐個字節(jié)存取。oracle.sql.BLOB類相應(yīng)提供了getBinaryStream()和getBinaryOutputStream()兩個方法,前一個方法用于讀取Oracle的BLOB字段,后一個方法用于將數(shù)據(jù)寫入Oracle的BLOB字段。對于CLOB類型,應(yīng)用Reader/Writer類,此類進行編碼轉(zhuǎn)換。oracle.sql.CLOB類相應(yīng)提供了getCharacterStream()和getCharacterOutputStream()兩個方法,前一個方法用于讀取Oracle的CLOB字段,后一個方法用于將數(shù)據(jù)寫入Oracle的CLOB字段。需要說明的是,為了大幅提高程序執(zhí)行效率,對BLOB/CLOB字段的讀寫操作,應(yīng)該使用緩沖操作類(帶Buffered前綴),即:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。例程中全部使用了緩沖操作類。小結(jié):通過JDBC操縱Oracle數(shù)據(jù)庫的LOB字段,不外乎插入、修改、替換、讀取四種方式,把握起來并不難。在實際操作中要注重上面所說的幾點,結(jié)合閱讀例程源程序,用戶會很快明白LOB類型字段的使用的,也必將領(lǐng)悟到這種類型字段的妙處!源文件下載>>(網(wǎng)頁編輯:編程浪子)
標簽: JDBC
主站蜘蛛池模板: 成a人片在线观看 | 欧美成人观看免费完全 | 久久久婷婷亚洲5月97色 | 可以免费观看的一级毛片 | 在线观看国产欧美 | 黄片1234| 热99re久久精品这里都是免费 | 看真人视频一级毛片 | 五月色综合婷婷综合俺来也 | 欧美一区二区三区免费 | 亚洲综合精品一区 | 黄色的网站免费观看 | 成人无遮挡免费网站视频在线观看 | 国产性高清在线观看 | 边做边摸边揉的免费视频 | 色综合999 | 91精品国产露脸在线 | xxxx色 | 日本乱中文字幕系列 | 亚洲精品综合 | 1024jd基地手机看国产 | 亚洲经典一区二区三区 | 国产欧美日韩专区 | 伊人久久久| 黄色片一 | 亚洲精品ai换脸一区二区三区 | 日本三级黄色 | 黄色香蕉网站 | 伊人久久精品午夜 | 人做人爱全免费视频 | 婷婷开心六月久久综合丁香 | 国产成人一区二区三区在线播放 | 国产最新自拍视频 | 国产精品嫩草影院人体模特 | 日韩在线视精品在亚洲 | 国产色产综合色产在线观看视频 | 一级α片 | 香蕉视频黄色 | 久久只有这才是精品99 | 在线一区二区三区 | 国产精品亚洲欧美一区麻豆 |