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