成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:2日期:2024-07-06 16:46:49
通過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類型字段的使用的,也必將領悟到這種類型字段的妙處!源文件下載>>(網頁編輯:編程浪子)
標簽: JDBC
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲国产欧美日韩另类综合| 国产精品人人做人人爽人人添| 欧美人与z0zoxxxx视频| 亚洲在线不卡| zzijzzij亚洲日本少妇熟睡| 久久精品一二三| 国产精品永久| 亚洲午夜久久久久中文字幕久| 国模一区二区三区| 精品欧美一区二区在线观看| 日本美女一区二区三区视频| 亚洲激情亚洲| 国产精品自拍网站| 日韩电影在线观看网站| 久久国产精品一区二区三区| 一区二区日韩电影| 欧美日韩国产高清| 久久影视一区二区| 欧美成人中文| 国产精品人妖ts系列视频| 欧美日韩在线高清| 中文一区二区在线观看| 午夜亚洲福利| 国产精品国产自产拍高清av| 国产精品v欧美精品∨日韩| 国产亚洲欧洲一区高清在线观看| 91影视在线播放| 久久久99精品久久| 午夜国产欧美理论在线播放| 国产精品国产精品国产专区不蜜 | 精品亚洲国内自在自线福利| 欧美日韩日本视频| 成人黄色电影在线 | 国内欧美视频一区二区| 在线播放欧美女士性生活| 国产99一区视频免费| 精品理论电影在线| 欧美激情91| 亚洲乱码国产乱码精品精小说 | 中文字幕一区二区在线播放| 夜夜爽www精品| 亚洲国产aⅴ天堂久久| 色八戒一区二区三区| 国产在线精品不卡| 久久综合久久综合九色| 欧美日韩影院| 午夜精品aaa| 欧美亚州韩日在线看免费版国语版| 国产一区二区调教| 精品国精品国产| 国内外成人免费视频| 亚洲国产毛片aaaaa无费看 | 亚洲精品免费播放| 欧美中文字幕不卡| 成人福利视频在线看| 国产精品麻豆欧美日韩ww| 国产精品日韩| 国产麻豆精品视频| 国产精品久久久久久久浪潮网站| 午夜在线视频观看日韩17c| 精品一区二区成人精品| 欧美成人免费网站| 亚洲第一黄网| 免费人成在线不卡| 日韩欧美亚洲国产精品字幕久久久| 欧美成人有码| 亚洲福利电影网| 日韩一区二区麻豆国产| 激情综合久久| 麻豆成人久久精品二区三区小说| 久久久亚洲精品一区二区三区| 在线亚洲伦理| 国产精品一区不卡| 中文字幕一区二区日韩精品绯色| 色偷偷88欧美精品久久久| 成人不卡免费av| 一区二区三区自拍| 欧美精品三级在线观看| 午夜精品网站| 日本亚洲一区二区| 久久精品人人爽人人爽| 国产麻豆综合| 国产成人精品一区二区三区四区 | 久久精品国产精品亚洲精品 | 一区二区三区中文在线| 欧美肥妇毛茸茸| 亚洲图色在线| 麻豆传媒一区二区三区| 欧美激情在线一区二区三区| 性久久久久久| 99精品视频在线观看免费| 午夜日韩在线观看| 久久综合色鬼综合色| 久久久久久九九九九| 91麻豆免费视频| 日本不卡一区二区三区高清视频| 亚洲精品一区二区精华| 日韩一级在线| 国产精品一二三四五| 欧美经典一区二区三区| 色8久久人人97超碰香蕉987| 午夜精品美女久久久久av福利| 日韩黄色小视频| 国产女人水真多18毛片18精品视频| 色综合久久天天| 91麻豆精品在线观看| 另类的小说在线视频另类成人小视频在线| 欧美激情一区二区三区蜜桃视频 | 欧美久久久久久久久| 国产乱码精品| 欧美 日韩 国产一区二区在线视频| 日韩成人精品视频| 国产精品国产三级国产| 欧美一区二区在线不卡| 亚洲一卡久久| 欧美激情日韩| 国产suv精品一区二区三区| 五月激情六月综合| 中文字幕精品—区二区四季| 欧美精品丝袜中出| 免费在线播放第一区高清av| 色综合婷婷久久| 国产揄拍国内精品对白| 亚洲大片在线观看| 国产精品久久久久婷婷| 欧美一区二区三区在线观看| 99视频在线精品国自产拍免费观看| 成人免费高清在线| 免费欧美在线视频| 亚洲午夜一二三区视频| 中文子幕无线码一区tr| 日韩一级免费观看| 日本道色综合久久| 亚洲精品在线二区| 91免费版在线| 成人午夜电影久久影院| 美女在线视频一区| 亚洲第一主播视频| 亚洲欧洲中文日韩久久av乱码| 久久精品视频免费| 精品剧情v国产在线观看在线| 欧美图区在线视频| 一本大道av伊人久久综合| 99精品热视频只有精品10| 欧美大片专区| 成人av免费观看| 国产综合色产在线精品| 日本 国产 欧美色综合| 亚洲国产综合视频在线观看| 亚洲人成网站精品片在线观看| 欧美国产亚洲另类动漫| 精品福利在线导航| 日韩一区二区免费视频| 欧美高清激情brazzers| 91官网在线免费观看| 色又黄又爽网站www久久| 国产视频一区免费看| 在线视频观看日韩| 国产精品99免费看| 欧美成人一区二区在线| 91啦中文在线观看| 91尤物视频在线观看| av不卡一区二区三区| 波多野洁衣一区| 成人一区二区三区视频| 成人免费高清在线观看| 不卡的av电影| 国产91精品免费| 国产黑丝在线一区二区三区| 国产高清亚洲一区| 粉嫩aⅴ一区二区三区四区| 国产经典欧美精品| 国产盗摄精品一区二区三区在线| 国产一区二区三区香蕉| 国产盗摄视频一区二区三区| 国产成人午夜99999| 国产成人精品免费看| 国产精品88888| 国产精品综合久久| 国产成人亚洲综合a∨婷婷| 国产69精品一区二区亚洲孕妇| 国产 日韩 欧美大片| 成人av网站免费观看| 91在线国内视频| 色综合天天综合网国产成人综合天| 色综合天天视频在线观看 | 欧美日韩精品| 亚洲精品极品| 午夜宅男久久久| 一本大道av伊人久久综合| 欧美日韩免费电影| 91精品久久久久久蜜臀| 精品国产一区二区三区久久久蜜月| 26uuu亚洲| 中文字幕高清一区| 亚洲欧美区自拍先锋| 亚洲高清一区二区三区| 裸体歌舞表演一区二区| 国产成人免费视频| 91在线观看地址|