程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> jdbc中如何處理Oracle BLOB字段

jdbc中如何處理Oracle BLOB字段

編輯:Oracle數據庫基礎

在前段時間我所在的項目中,就碰到了這個問題,我花了2天的時間才將BLOB的問題搞定。
我也嘗試過網上所介紹的各種方法,那些方法所使用的原理都一致,但都寫得不完整,我也
按照網上介紹的方法做了,但都因為其中一些沒有提到的小的細節而失敗。希望看到這篇文
章的人都不再走彎路。一般人會走哪些彎路?
 
1.使用jdk中的方法進行傳輸。
在ResultSet中有getBlob()方法,在PreparedStatement中有setBlob()方法,所以大多數人都
會嘗試setBlob(),getBlob()進行讀寫,或者兩個數據庫之間BLOB的傳輸。這種方法實際上是行
不通的,據網上的一些資料介紹,說sun官方的文檔有些方法都是錯誤的。

2.使用ResultSet.getBinaryStream 和PreparedStatement.setBinaryStream對BLOB進行讀寫或
兩個數據庫間的傳輸。
這種方法我自己嘗試過,發現,如果BLOB中存儲的是文本文件的話,就沒問題,如果是二進制
文件,傳輸就會有問題。

根據自己的經驗,以及查閱了Oracle的官方文檔,都是使用如下處理方法:
 
1.新建記錄,插入BLOB數據

1.1首先新建記錄的時候,使用Oracle的函數插入一個空的BLOB,假設字段A是BLOB類型的:
insert xxxtable(A,B,C) values(empty_blob(),''xxx'',''yyyy'')

1.2後面再查詢剛才插入的記錄,然後更新BLOB,在查詢前,注意設置Connection的一個屬性
conn.setAutoCommit(false);
如果缺少這一步,可能導致fetch out of sequence等異常.

1.3 查詢剛才插入的記錄,後面要加“ for update ”,如下:
select A from xxxtable where xxx=999 for update;
如果缺少for update,可能出現row containing the LOB value is not locked的異常

1.4 從查詢到的 BLOB字段中,獲取blob並進行更新,代碼如下:
 BLOB blob = (BLOB) rs.getBlob("A");
 OutputStream os = blob.getBinaryOutputStream();
 BufferedOutputStream output = new BufferedOutputStream(os);

後面再使用output.write方法將需要寫入的內容寫到output中就可以了。
例如我們將一個文件寫入這個字段中:
  BufferedInputStream input = new BufferedInputStream(
   new File("c:\\hpWave.log").toURL().openStream());
  byte[] buff = new byte[2048];
  //用做文件寫入的緩沖
  int bytesRead;
  while(-1 != (bytesRead = input.read(
   buff, 0, buff.length)))
  {
   output.write(buff, 0, bytesRead);
   System.out.println(bytesRead);
  }
上面的代碼就是從input裡2k地讀取,然後寫入到output中。

1.5上面執行完畢後,記得關閉output,input,以及關閉查詢到的ResultSet

1.6最後執行conn.commit();將更新的內容提交,以及執行conn.setAutoCommit(true);
改回Connction的屬性
 
2.修改記錄,方法與上面的方法類似
 
2.1首先更新BLOB以外的其他字段

2.2 使用1.3中類似的方法獲取記錄

2.3 修改的過程中,注意以下:

a :需要更新的記錄中,BLOB有可能為NULL,這樣在執行blob.getBinaryOutputStream()獲取
的值可能為null,那麼就關閉剛才select的記錄,再執行一次
update xxxtable set A = empty_blob() where xxx;
這樣就先寫入了一個空的BLOB(不是null),然後再使用1.3,

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved