方案背景與 ORADBI 簡介
- BLOB 儲存二進位資料,原生 OCI 代碼冗長易錯。
- ORADBI: 基於 OCI 的 C 語言 API 封裝庫,開源免費 (保留版權),持續維護 1 年+,支援多檔案單欄位寫入/讀出。
- 下載:CSDN 下載鏈結
前置需求
- Oracle 9i/10g Client (10g 僅需 Instant Client)。
- ORADBI 庫原始碼與範例程式。
資料庫表結構
CREATE TABLE TEST (
BM VARCHAR2(10),
NAME VARCHAR2(100),
BIRTH DATE,
DATA BLOB
) TABLESPACE USERS PCTFREE 10 INITRANS 1 MAXTRANS 255
STORAGE (INITIAL 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED);
核心程式碼片段解析
1. 定義待寫入檔案陣列
const char* arrLobFiles[] = {
"E:\\eBookLib\\...\\Cryptography in C and C++_SourceCode.rar",
"E:\\eBookLib\\...\\Algorithms For Compiler Design.chm",
// ... 共 12 個檔案
};
2. 連線與 SQL 準備
ORA_connection_create(&con, "CHEUNG", "mineusr", "minepwd", OCI_THREADED|OCI_OBJECT, FALSE, &err);
ORA_sqlstmt_create(&stmt, con,
"INSERT INTO TEST (BM,NAME,BIRTH,DATA) VALUES (:bm,:name,:birth,:blob)", -1, 0, &err);
3. 綁定參數與 LOB 檔案流
ORA_sqlstmt_bind(stmt, ":bm", ODT_TEXT, 0, &p[0], &err);
ORA_sqlstmt_bind(stmt, ":name", ODT_TEXT, 100, &p[1], &err);
ORA_sqlstmt_bind(stmt, ":birth", ODT_DATE, 0, &p[2], &err);
ORADBI_InBind inbind;
ORA_inbind_lobfile_init(&inbind, 0, arrLobFiles,
sizeof(arrLobFiles)/sizeof(arrLobFiles[0]), &err);
ORA_sqlstmt_bind_lob(stmt, ":blob", 0, &inbind, 0, &p[3], &err);
4. 設定標量參數並執行
ORA_param_set_string(p[0], "2008", -1, &err);
ORA_param_set_string(p[1], "BeiJing", -1, &err);
ORA_datetime_create(&dt, 1);
ORA_param_set_datetime(p[2], dt, &err);
ORA_datetime_free(dt);
ORA_sqlstmt_execute(stmt, MOD_DEFAULT, 0, &err);
ORA_connection_commit(con, &err);
5. 資源釋放
ORA_inbind_lobfile_free(&inbind);
ORA_sqlstmt_free(stmt);
ORA_connection_free(con);
關鍵技術優勢
- 串流式寫入: 避免將大檔案完整載入記憶體,直接從檔案系統流式傳輸至資料庫 LOB。
- 多檔案聚合: 單次 INSERT 將多個獨立檔案連續寫入同一 BLOB 欄位,應用層自行定義分隔/索引邏輯。
- 極簡 API: 核心流程僅 30 行 C 代碼,對比原生 OCI 數百行。
- 記憶體安全: 內建
_CrtDumpMemoryLeaks 偵測洩漏。
擴展應用方向
- 讀取端:對應
ORA_outbind_lobfile_init 將 BLOB 還原為多個檔案。
- 中介軟體整合:封裝為共享庫供 Java/Python/Node.js 透過 FFI 調用。
- 雲端遷移:批次將檔案系統非結構化資料遷移至 Oracle BLOB/物件儲存。