Dev@Free

          zJun's Tech Weblog

          [深入淺出Hibernate筆記] Oracle中的大字段 Blob/Clob

          數據庫中提供了兩種字段類型 Blob??和 Clob 用于存儲大型字符串或二進制數據(如圖片)。

          Blob 采用單字節存儲,適合保存二進制數據,如圖片文件。
          Clob 采用多字節存儲,適合保存大型文本數據。

          Oracle中處理BLOB/CLOB字段的方式比較特別,所以需要特別注意下面兩點:

          1. 在Oracle JDBC中采用流機制對 BLOB/CLOB 進行讀寫操作,所以要注意不能在批處理中讀寫 BLOB/CLOB字段,否則將出現
          Stream type cannot be used in batching 異常。

          2. Oracle BLOB/CLOB 字段本身擁有一個游標(cursor),JDBC通過游標對Blob/Clob字段進行操作,在Blob/Clob字段創建之前,無法獲取其游標句柄,會出現
          Connection reset by peer: socket write error 異常。

          正確的做法是:首先創建一個空 Blob/Clob 字段,再從這個空 Blob/Clob字段獲取游標,例如下面的代碼:

          PreparedStatement?ps? = ?conn.prepareStatement( " insert?into?PICTURE(image,resume)?values(?,?) " );
          // ?通過oralce.sql.BLOB/CLOB.empty_lob()構造空Blob/Clob對象

          ps.setBlob( 1 ,oracle.sql.BLOB.empty_lob());
          ps.setClob(
          2
          ,oracle.sql.CLOB.empty_lob());

          ps.excuteUpdate();
          ps.close();

          // ?再次對讀出Blob/Clob句柄

          ps? = ?conn.prepareStatement( " select?image,resume?from?PICTURE?where?id=??for?update " );
          ps.setInt(
          1 , 100
          );

          ResultSet?rs?
          =
          ?ps.executeQuery();
          rs.next();

          oracle.sql.BLOB?imgBlob?
          = ?(oracle.sql.BLOB)rs.getBlob( 1
          );
          oracle.sql.CLOB?resClob?
          = ?(oracle.sql.CLOB)rs.getClob( 2
          );

          // ?將二進制數據寫入Blob

          FileInputStream?inStream? = ? new ?FileInputStream( " c://image.jpg " );
          OutputStream?outStream?
          =
          ?imgBlob.getBinaryOutputStream();

          byte []?buf? = ? new ? byte [ 10240
          ];
          int
          ?len;
          while (len = inStream.read(buf) > 0 )
          {
          ??outStream.write(buf,
          0
          ,len);
          }

          inStream.close();
          outStream.cloese();

          // ?將字符串寫入Clob
          resClob.putString( 1 , " this?is?a?clob " );

          // ?再將Blob/Clob字段更新到數據庫

          ps? = ?conn.prepareStatement( " update?PICTURE?set?image=??and?resume=??where?id=? " );
          ps.setBlob(
          1
          ,imgBlob);
          ps.setClob(
          2
          ,resClob);
          ps.setInt(
          3 , 100
          );

          ps.executeUpdate();
          ps.close();


          posted on 2006-08-15 16:39 zJun's帛羅閣 閱讀(5392) 評論(1)  編輯  收藏 所屬分類: 數據庫

          評論

          # re: [深入淺出Hibernate筆記] Oracle中的大字段 Blob/Clob 2010-01-14 13:53

          http://iceland1986.blog128.fc2.com/blog-entry-3.html
          作者文不對題。。用上面就可以做到。不過只有讀取。  回復  更多評論   

          導航

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊

          收藏夾

          博客

          文檔

          站點

          論壇

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南昌市| 佛教| 海安县| 宜黄县| 宾川县| 巢湖市| 南澳县| 宜宾市| 洛南县| 东方市| 松潘县| 海宁市| 襄垣县| 芒康县| 怀集县| 翁源县| 宣武区| 黄平县| 肇源县| 民乐县| 海阳市| 澜沧| 大悟县| 宁陕县| 绍兴市| 邹平县| 米林县| 虹口区| 巴青县| 湟源县| 锦州市| 嘉定区| 仪征市| 通州市| 大石桥市| 辽源市| 游戏| 盐亭县| 郁南县| 南安市| 晋中市|