电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:4日期: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
主站蜘蛛池模板: 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 直齿驱动-新型回转驱动和回转支承解决方案提供商-不二传动 | 聚丙烯酰胺_厂家_价格-河南唐达净水材料有限公司 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 下水道疏通_管道疏通_马桶疏通_附近疏通电话- 立刻通 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 洗石机-移动滚筒式,振动,螺旋,洗矿机-青州冠诚重工机械有限公司 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 生产加气砖设备厂家很多,杜甫机械加气砖设备价格公道 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 苏州西装定制-西服定制厂家-职业装定制厂家-尺品服饰西装定做公司 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 万博士范文网-您身边的范文参考网站Vanbs.com | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 匀胶机旋涂仪-声扫显微镜-工业水浸超声-安赛斯(北京)科技有限公司 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺| 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 济南侦探调查-济南调查取证-山东私家侦探-山东白豹调查咨询公司 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 杭州门窗厂家_阳光房_包阳台安装电话-杭州窗猫铝合金门窗 |