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

Oracle數據庫中BLOB字段的存取問題

編輯:Oracle數據庫基礎

以下的文章主要是對Oracle數據庫中BLOB字段的存取問題的介紹,我在經常會碰到Oracle數據庫中BLOB字段的存取這一問題,需求是將一個文件或者文件流存儲到Oracle數據庫裡,Oracle8提供了Blob和Clob用來存儲二進制大對象數據。

可是它和Java.sql.裡面的Blob不兼容,經常導致Blob字段無法鎖定或者操作失敗,總之我總結了一些經驗大家共享。

首先建立測試數據表

  1. drop table filelist;  
  2. commit;  
  3. CREATE TABLE SYSTEM.FILELIST (  
  4. "FILENAME" VARCHAR2(50) NOT NULL,  
  5. "FILESIZE" NUMBER(20) NULL,  
  6. "FILEBODY" BLOB NULL,  
  7. PRIMARY KEY("FILENAME"), UNIQUE("FILENAME")) ;  
  8. commit;  

測試過程,首先將硬盤文件讀入Oracle數據庫,然後再讀出到硬盤的另一個新文件裡,原碼如下:

  1. import Java.io.*;  
  2. import Java.util.*;  
  3. import Java.sql.*;  
  4. import Oracle.sql.*;  
  5. import Oracle.jdbc.driver.*;  
  6. import Java.text.*;  
  7. public class test  
  8. {  
  9. public static void main(String args[]) throws java.io.IOException,Java.sql.SQLException  
  10. {  
  11. dbBean db1=new dbBean();  
  12. /**  

*這裡是我的數據聯接Bean

*大家可以用自己的連接Bean

  1. */  
  2. byte a[]=null;  

**將測試文件test.doc讀入此字節數組

  1. Java.io.FileInputStream fin=null;  
  2. Java.io.FileOutputStream fout=null;  
  3. oracle.jdbc.OracleResultSet ors=null;  

**這裡rs一定要用Oracle數據庫提供的

  1. oracle.jdbc.driver.OraclePreparedStatement opst=null

**PreparedStatement用

Oracle提供的

  1. try  
  2. {  
  3. Java.io.File f1=new Java.io.File("c:/temp/test.doc");  
  4. Java.io.File f2=new Java.io.File("c:/temp/testout.doc");  

**從BLOB讀出的信息寫

//入該文件,和源文件對比測試用

  1. fin=new Java.io.FileInputStream(f1);  
  2. fout=new Java.io.FileOutputStream(f2);  

int flength=(int)f1.length();//**讀入文件的字節長度

  1. System.out.println("file length::"+flength);  
  2. a=new byte[flength];  
  3. int i=0;int itotal=0;  

/**將文件讀入字節數組

  1. for (;itotal<flength;iitotal=i+itotal )  
  2. {  
  3. i=fin.read(a,itotal,flength-itotal);  
  4. }  
  5. fin.close();  
  6. System.out.println("read itotal::"+itotal);  

/**注意Oracle數據庫的 BLOB一定要用EMPTY_BLOB()初始化

  1. String MySQL="insert into filelist (FileName,FileSize,FileBody) values (?,?,EMPTY_BLOB())";  
  2. opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(MySQL);  
  3. opst.setString(1,"Wordtemplate");  
  4. opst.setInt (2,flength);  
  5. opst.executeUpdate();  
  6. opst.clearParameters();  

/**插入其它數據後,定位BLOB字段

  1. MySQL="select filebody from filelist where filename=?";  
  2. opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(MySQL);  
  3. opst.setString(1,"Wordtemplate");  
  4. ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();  
  5. if (ors.next())  
  6. {  

Oracle.sql.BLOB blob=ors.getBLOB(1);/**得到BLOB字段

int j=blob.putBytes(1,a);/**將字節數組寫入BLOB字段

  1. System.out.println("j:"+j);  
  2. db1.conn.commit();  
  3. ors.close();  
  4. }  
  5. System.out.println("insert into ok");  

byte b[]=null;/**保存從BLOB讀出的字節

  1. opst.clearParameters();  
  2. MySQL="select filebody from filelist where filename=?";  
  3. opst=(oracle.jdbc.driver.OraclePreparedStatement)db1.conn.prepareStatement(MySQL);  
  4. opst.setString(1,"Wordtemplate");  
  5. ors=(oracle.jdbc.OracleResultSet)opst.executeQuery();  
  6. if (ors.next())  
  7. {  
  8. Oracle.sql.BLOB blob2=ors.getBLOB(1);  
  9. System.out.println("blob2 length:"+blob2.length());  

b=blob2.getBytes(1,flength);/**從BLOB取出字節流數據

  1. System.out.println("b length::"+b.length);  
  2. db1.conn.commit();  
  3. }  
  4. ors.close();  

/**將從BLOB讀出的字節寫入文件

  1. fout.write(b,0,b.length);  
  2. fout.close();  
  3. System.out.println("write itotal::"+b.length);  
  4. }  
  5. catch(Exception e)  
  6. {  
  7. System.out.println("errror :"+e.toString() );  
  8. e.printStackTrace();  
  9. }  
  10. finally  

{ /**關閉所有數據聯接

  1. stmt.close();  
  2. db1.closeConn();  
  3. }  
  4. }  
  5. }  

編譯運行在TomCat下調試通過。

需要注意的是Blob存取的過程,一般先存入和BLOB相關的控制數據,如文件的名字,然後查詢定位BLOB字段,利用Oracle數據庫Blob提供的方法:

  1. public int putBytes(long pos,byte bytes[])  
  2. public byte[] getBytes(long pos,byte bytes[])  

或者利用

  1. public OutputStream getBinaryOutputStream() throws SQLException  
  2. public InputStream getBinaryStream() throws SQLException  

因為利用輸入輸出流總歸還是利用到字節數組緩沖流,所以就不舉例子了。

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