Dev@Free

          zJun's Tech Weblog

          [深入淺出Hibernate筆記](méi) Oracle中的大字段 Blob/Clob

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

          Blob 采用單字節(jié)存儲(chǔ),適合保存二進(jìn)制數(shù)據(jù),如圖片文件。
          Clob 采用多字節(jié)存儲(chǔ),適合保存大型文本數(shù)據(jù)。

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

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

          2. Oracle BLOB/CLOB 字段本身?yè)碛幸粋€(gè)游標(biāo)(cursor),JDBC通過(guò)游標(biāo)對(duì)Blob/Clob字段進(jìn)行操作,在Blob/Clob字段創(chuàng)建之前,無(wú)法獲取其游標(biāo)句柄,會(huì)出現(xiàn)
          Connection reset by peer: socket write error 異常。

          正確的做法是:首先創(chuàng)建一個(gè)空 Blob/Clob 字段,再?gòu)倪@個(gè)空 Blob/Clob字段獲取游標(biāo),例如下面的代碼:

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

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

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

          // ?再次對(duì)讀出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
          );

          // ?將二進(jìn)制數(shù)據(jù)寫(xiě)入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();

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

          // ?再將Blob/Clob字段更新到數(shù)據(jù)庫(kù)

          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帛羅閣 閱讀(5397) 評(píng)論(1)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          評(píng)論

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

          http://iceland1986.blog128.fc2.com/blog-entry-3.html
          作者文不對(duì)題。。用上面就可以做到。不過(guò)只有讀取。  回復(fù)  更多評(píng)論   

          導(dǎo)航

          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統(tǒng)計(jì)

          常用鏈接

          留言簿(15)

          隨筆分類

          隨筆檔案

          相冊(cè)

          收藏夾

          博客

          文檔

          站點(diǎn)

          論壇

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 乐安县| 阜南县| 宜阳县| 定南县| 拜泉县| 游戏| 临沧市| 长沙县| 哈尔滨市| 瓮安县| 静安区| 周宁县| 措美县| 青田县| 东方市| 昌宁县| 大化| 普洱| 衡水市| 唐山市| 石台县| 大埔区| 申扎县| 英德市| 汝州市| 瑞金市| 临西县| 甘泉县| 云梦县| 太湖县| 黄大仙区| 盈江县| 双江| 高邮市| 基隆市| 鲁山县| 平武县| 论坛| 鹿泉市| 澜沧| 泽普县|