在 Oracle 資料庫維護中,常遇到需要導出多張資料表,且每張表的查詢條件各不相同的情況。傳統的 exp 工具雖然支援 query 參數,但無法針對不同表套用不同的 WHERE 條件。本文將介紹幾種實用策略,幫助您靈活完成資料導出。
當資料量不大時,最簡單的做法是分兩步走:
exp 導出表結構(不含資料),參數加上 rows=n。此法適合開發、測試環境,或資料筆數在萬級以下的場景。
針對百萬級以上資料,建議採用「建立臨時表 → 寫入篩選資料 → 導出臨時表」的流程:
-- 以表 A 為例,需導出 status=1 且 create_date > '2023-01-01' 的資料
CREATE GLOBAL TEMPORARY TABLE temp_export_A ON COMMIT PRESERVE ROWS
AS SELECT * FROM table_A WHERE status = 1 AND create_date > DATE '2023-01-01';
-- 重複上述步驟建立其他表對應的臨時表
-- 最後統一導出所有臨時表
exp userid=system/password tables=temp_export_A,temp_export_B,... file=export.dmp log=export.log
優點:
✅ 可針對每張表套用獨立 WHERE 條件
✅ 利用資料庫內部操作,效能遠高於應用層逐筆讀寫
✅ 導入時只需 imp 導入臨時表,再批次 RENAME 回正式表名
Oracle 10g+ 推薦使用 Data Pump,支援 QUERY 參數針對單表,但仍無法一次指定多表不同條件。可結合 INCLUDE 與動態 PL/SQL 腳本:
DECLARE
v_sql VARCHAR2(4000);
BEGIN
FOR t IN (SELECT table_name, where_clause FROM export_config) LOOP
v_sql := 'CREATE TABLE tmp_' || t.table_name || ' AS SELECT * FROM ' || t.table_name || ' WHERE ' || t.where_clause;
EXECUTE IMMEDIATE v_sql;
END LOOP;
END;
/
-- 然後 expdp 匯出所有 tmp_ 開頭的表
若在 C# 中呼叫,可透過 OracleCommand 執行上述 DDL/DML,再啟動 Process.Start("expdp.exe", args) 進行導出。注意權限:執行身分需具備 CREATE TABLE、DATAPUMP_EXP_FULL_DATABASE 權限。
| 場景 | 推薦策略 | 關鍵點 |
|---|---|---|
| 資料量 < 1 萬筆 | 結構+資料分離 | 簡單、無需建臨時物件 |
| 資料量大、條件各異 | 臨時表中轉 | 效能最佳、支援平行導出 |
| 需排程自動化 | Data Pump + 動態 PL/SQL | 可封裝成 Stored Procedure 排程執行 |
選對策略,事半功倍。祝您導出順利!