多媒體信息傳統以文件形式由作業系統管理,隨著網絡與分布式計算發展,高效管理、存取、查詢成為剛需。關係數據庫強大的數據管理能力使多媒體數據庫應運而生。Oracle 8i 引入 LOB 標準,InterMedia 進一步擴展圖像/音視頻/文本處理能力。
| 類型 | 說明 | 對應舊類型 |
|---|---|---|
| CLOB | 單字節字符大對象 | LONG |
| NCLOB | 定寬多字節國家字符集 | — |
| BLOB | 非結構二進制數據 | LONG RAW |
| BFILE | 外部文件只讀訪問,數據不在庫內 | — |
關鍵特性: 4GB 上限(舊 2GB);支持 OCI/dbms_lob 操作;單表可多 LOB 列;具備事務特性;存儲分離,通過定位符指向實際數據。
-- 1. 建表
CREATE TABLE lobdemo(key NUMBER PRIMARY KEY, clob_col CLOB, blob_col BLOB, bfile_col BFILE);
-- 2. 插入:字符串直接存 CLOB,BLOB 用 EMPTY_BLOB() 初始化定位符
INSERT INTO lobdemo(key, clob_col, blob_col, bfile_col)
VALUES (10, 'abcdefghijklmnopqrstuvwxyz', EMPTY_BLOB(), NULL);
-- 3. 查詢返回定位符而非實際數據
SELECT blob_col FROM lobdemo WHERE key = 20;
-- 4. 更新
UPDATE lobdemo SET blob_col = 'aedevbagddgagdfdfasasdfdsa' WHERE key = 10;
CREATE DIRECTORY utils AS '/home/utils';BFILENAME('utils','file1') 插入定位符(非文件本身)。SQL 僅能整體操作 LOB,dbms_lob 允許片段讀寫。核心例程:
FILEOPEN:打開 OS 文件LOADFROMFILE:將 OS 文件載入目標 LOB(極具實用價值,如導入音頻二進制)GETLENGTH:取文件長度CREATE OR REPLACE PROCEDURE FileExec(p_Directory VARCHAR2, p_Filename VARCHAR2) AS
v_FileLocator BFILE; v_CLOBLocator CLOB;
BEGIN
SELECT clob_col INTO v_CLOBLocator FROM lobdemo WHERE key = -1 FOR UPDATE;
v_FileLocator := BFILENAME(p_Directory, p_Filename);
DBMS_LOB.FILEOPEN(v_FileLocator, DBMS_LOB.FILE_READONLY);
DBMS_LOB.LOADFROMFILE(v_CLOBLocator, v_FileLocator, DBMS_LOB.GETLENGTH(v_FileLocator));
END;
InterMedia 為 Oracle 8i 擴充組件,提供 ORDAudio、ORDImage、ORDVideo 對象類型,內置格式轉換、壓縮、裁剪、屬性提取等方法,遠超普通 LOB 能力。
Web 應用優勢: 將多媒體存入數據庫,統一維護、備份,避免文件系統目錄數限制與管理混亂。
-- 1. 定義對象類型
CREATE TYPE songObject AS OBJECT (
songId VARCHAR2(20), title VARCHAR2(4000), artist VARCHAR2(4000),
awards VARCHAR2(4000), timePeriod VARCHAR2(20), txtinroduction CLOB,
audioSource ORDSYS.ORDAUDIO
);
-- 2. 建表
CREATE TABLE SongsTable OF songObject (UNIQUE(songId), songId NOT NULL);
-- 3. 插入空定位符行
INSERT INTO SongsTable VALUES ('00', 'Under Pressure', 'Queen', 'no awards', '80-90',
243, NULL, EMPTY_CLOB(), ORDSYS.ORDAudio(...));
-- 4. 載入音頻文件並設置屬性
DECLARE audioObj ORDSYS.ORDAUDIO; ctx RAW(4000) := NULL;
BEGIN
SELECT S.audioSource INTO audioObj FROM SongsTable S WHERE S.songId = '00' FOR UPDATE;
audioObj.setSource('FILE', 'AUDDIR', 'UnderPressure.au');
audioObj.setMimeType('audio/basic');
audioObj.import(ctx);
audioObj.setProperties(ctx);
UPDATE SongsTable S SET S.audioSource = audioObj WHERE S.songId = '00';
COMMIT;
END;