首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 自動產生 Oracle SQL*Loader 控制檔、資料檔與建表腳本

     編輯:關於C++

從 FoxPro (DBF) 遷移至 Oracle 時,需將大量 DBF 檔案轉換為 SQL*Loader 可用的**控制檔 (.ctl)、資料檔 (.dat/.txt)、建表 SQL (.sql)**。手工編寫極易在位置計算 (POSITION) 上出錯。本文提供完整 C++ 程式 load.cpp,自動解析 DBF 檔頭與欄位定義,一次產生三種檔案,大幅提升遷移效率。

DBF 檔案結構速覽

區塊位移大小說明
檔頭標識01 Byte0x03 (無 Memo) / 0x83 (有 Memo)
最後更新1-33 BytesYYMMDD
記錄筆數4-74 BytesLittle-endian DWORD
檔頭長度8-92 Bytes含欄位定義 + 結束標識
記錄長度10-112 Bytes含刪除旗標 1 Byte
欄位定義32~N32 Bytes/欄名稱(11)、類型(1)、位移(4)、長度(1)、小數位(1)、保留(14)
資料區檔頭長度記錄長度×筆數每筆以 0x20 (空白) 開頭作刪除旗標

型別對應規則

FoxPro 型別SQL*Loader 格式Oracle 型別
Character (C)CHARCHAR(n)
Logical (L)CHARCHAR(1) ('T'/'F')
Numeric (N) 無小數INTEGER EXTERNAL NULLIF = BLANKSNUMBER(p)
Numeric (N) 有小數DECIMAL EXTERNAL NULLIF = BLANKSNUMBER(p,s)
Date (D)DATE "YYYYMMDD" NULLIF = BLANKSDATE

核心程式碼架構 (load.cpp 精簡版)

#include 
#include 
#include 
#include 
#include 
using namespace std;

#pragma pack(1)
struct DBF_HEADER {
    uchar  flag; uchar  date[3]; ulong  recCount;
    ushort headLen; ushort recLen; uchar reserved[20];
};
struct DBF_FIELD {
    char   name[11]; uchar type; ulong offset;
    uchar  len; uchar dec; uchar reserved[14];
};
#pragma pack()

int main(int argc, char** argv) {
    if (argc != 2) { cerr << "Usage: load \n"; return 1; }
    char base[64]; strcpy(base, argv[1]);

    // 1. 讀取 DBF 檔頭與欄位定義
    FILE* fp = fopen(strcat(strcpy(new char[64], base), ".dbf"), "rb");
    DBF_HEADER hdr; fread(&hdr, sizeof(hdr), 1, fp);
    int fldCount = (hdr.headLen - 1) / 32 - 1;
    DBF_FIELD* flds = new DBF_FIELD[fldCount];
    for (int i=0; i

使用流程

  1. 編譯:`bcc32 load.cpp` (或任意 C++ 編譯器)。
  2. 執行:`load.exe customer` → 產生 `customer.ctl`, `customer.sql`, `customer.txt`。
  3. Oracle 端:`sqlplus user/pass @customer.sql` 建表。
  4. 載入:`sqlldr user/pass control=customer.ctl log=customer.log`。

進階擴充建議

  • Memo/Blob 欄位:解析 DBT/FPT 檔案,輸出為 LOBFILE 或外部檔案參考。
  • 字元集轉換:FoxPro OEM (CP437/936) → Oracle AL32UTF8,使用 `iconv` 或 `MultiByteToWideChar`。
  • 大檔案分割:超過 2GB 時自動分割 .txt 並產生多個 `INFILE` 子句。
  • 並行載入:產生 `PARALLEL=TRUE` 控制檔配合 `DIRECT=TRUE` 直載模式。
  • 錯誤處理:記錄 `sqlldr` bad/discard 檔案,自動重試或人工複核。

結語

自動解析 DBF 結構產生 SQL*Loader 三件組,消除手工位置計算錯誤,將遷移效率提升數十倍。同樣原理可擴充至 dBase、Clipper、Visual FoxPro 等 XBase 系列資料庫遷移專案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved