天天看點

用Jdbc存取Oracle大字段對象

1 Oracle資料庫有以下幾種大對象:

 曆史上,大對象資料的處理向來是rdbms的'錦上添花',對于這種類型資料的處理,一般資料庫廠商{曆史上,過去時}使用的方法是:在相關列上儲存指向作業系統檔案的指針,資料存儲于這些檔案.但是,由此帶來了一系列的問題:

 *維護的代價{管理,例如備份/恢複的不便};

 *事務的控制/性能的考慮{這些字段一般不能復原、無優化};

 *标準性{沒有統一标準,代碼和列類型\列資料都是依賴具體資料庫的};

 Oracle不同版本的lob類型比較:

 7& later:{内部的、隻能有一列、順序存取、查詢傳回資料}

 -long  長文本    2G

 -raw  固定長度的二進制資料  2000 Bytes

 -long raw 可變長度的二進制資料  2G

 Just8i & later:{内外部的、能有N列、順序随機存取、查詢傳回指針}

 -blob  内部二進制資料   4G {以位元組為處理機關}

 -clob  内部文本資料   4G {以字元為處理機關}

 -nclob  内部根據字元集而定的字元資料 4G {以字元為處理機關}

 -BFile  外部外部二進制檔案   {以位元組為處理機關}

 {内部指和表一樣存放在Oracle資料庫的某個段中,而外部是指存放于獨立于Oracle的作業系統檔案}

2 對大對象來說:

 *insert意味着插入定位器和null值(同時建立對lob列的Index);

 *update意味着更新lob的全部{不能更新某個區域}

 *delete意味着删除定位器和内容;

3 執行個體:

 3.1 使用BLOB:

 *建立表

     CREATE TABLE "BIGFOU"."T_VIDEO"("ID" NUMBER NOT NULL, "VIDEO"

     BLOB NOT NULL,

     CONSTRAINT "PK_BIGFOU_VIDEO" UNIQUE("ID") USING INDEX TABLESPACE "BIGFOU")     

     //主鍵,其中限制存儲于bigfou表空間中

     TABLESPACE "BIGFOU"        //表空間

     LOB("VIDEO") STORE AS (  TABLESPACE "BIGFOU"   //對于VIDEO這個lob列來說,存儲于bigfou表空間,

     ENABLE STORAGE IN ROW //按行存儲

     NOCACHE)    //不啟用高速緩存

 *寫blob字段

  寫blob字段的一般方法是利用java或者其他語言程式設計寫入(當然也可以使用plsql);

  -java實作:

   java.sql包裡面包含了對标準blob和clob sql類型的映射接口,public interface Blob和public interface Clob

  通過ResultSet的GetBlob方法可以獲得blob接口,這兩個接口供不同的廠商繼承來實作對專有資料庫的支援,Oracle提供了BLOB類實作Blob接口,并提供了操作blob列的方法。

   public static void main(String[] args) {

    // TODO Auto-generated method stub

    Connection conn = null;

    Statement stat = null;

    ResultSet rs = null;

    OutputStream os = null;

    FileInputStream fis = null;

int bs = 0;

    try {

     Class.forName("oracle.jdbc.driver.OracleDriver");

     conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oraDB","bigfou","---");

     conn.setAutoCommit(false);

     stat = conn.createStatement();

     stat.executeUpdate("insert into t_video(id,video) values(1,empty_blob())");

     rs = stat.executeQuery("select video from t_video where id = 1");

     rs.next();

     oracle.sql.BLOB blo = (oracle.sql.BLOB)rs.getBlob(1);

     os = blo.getBinaryOutputStream();

     bs = blo.getBufferSize();

     fis = new FileInputStream("D://Temp//MPlayer-CVS-20040808-K&K//mplayer.exe");

     byte[] buf = new byte[bs];

     int length = 0;

     while(true)

     { 

      length = fis.read(buf);

      if(length == -1) break;

      os.write(buf,0,length);

     }

     os.close();

     os = null;

     fis.close();

     fis = null;

     conn.commit();

     conn.setAutoCommit(true);

     conn.close();

    } catch(Exception ex) {

     ex.printStackTrace();

    }

   }

  -plsql實作:

 *讀blob字段

  -用plsql developer:直接使用類似于select video from bigfou.t_video where id=1的語句查詢,然後在結果視圖裡面導出blob為作業系統檔案即可;

  -用java

   ...

   InputStream is = null;

   FileOutputStream fos = null;

   byte[] buf = null;

   int bs = 0;

   try {

    Class.forName("oracle.jdbc.driver.OracleDriver");

    conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oraDB","bigfou","-");

    conn.setAutoCommit(false);

    stat = conn.createStatement();

    rs = stat.executeQuery("select video from t_video where id = 1");

    rs.next();

    oracle.sql.BLOB blo = (oracle.sql.BLOB)rs.getBlob(1);

    bs = blo.getBufferSize();

    buf = new byte[bs];

    int length = 0;

    is = blo.getBinaryStream();

    fos = new FileOutputStream("d://test.exe");

    while(true) {

     length = is.read(buf);

     if(length == -1) break;

     fos.write(buf,0,length);

    }

    fos.close();

    fos = null;

    is.close();

    is = null;

    conn.commit();

    conn.setAutoCommit(true);

    conn.close();

    ...  

http://bigfou.bokee.com/1195393.html