Oracle Data Pump Export(expdp)の queryパラメータを使うと、テーブル全体ではなく特定の条件に合致するレコードだけをエクスポートできます。開発環境へのサンプルデータ移行・特定期間データの抽出・部分バックアップなどで非常に役立ちます。
本記事では基本構文から、複数テーブルへの個別条件指定・parfile活用・OS別クォート対策・よくあるエラーまでを完全解説します。
queryパラメータの基本構文
Shell — expdp query パラメータの基本構文
expdp ユーザー名/パスワード \
directory=DATA_PUMP_DIR \
dumpfile=export.dmp \
logfile=export.log \
tables=テーブル名 \
query="WHERE 条件式"
ポイント: queryパラメータは tables パラメータと組み合わせて使います。スキーマ全体エクスポート(schemas)の場合は テーブル名:WHERE条件 の形式で指定します。
基本的な使用例
数値条件で絞り込む
Shell — 部署番号が10のレコードだけをエクスポート
expdp scott/tiger \
directory=DATA_PUMP_DIR \
dumpfile=emp_dept10.dmp \
logfile=emp_dept10.log \
tables=emp \
query="WHERE deptno = 10"
日付条件で絞り込む
Shell — 入社日が2023年以降のレコードをエクスポート
expdp scott/tiger \
directory=DATA_PUMP_DIR \
dumpfile=emp_2023.dmp \
logfile=emp_2023.log \
tables=emp \
query="WHERE hiredate >= TO_DATE('2023-01-01','YYYY-MM-DD')"
複合条件(AND / OR)
Shell — 部署10のマネージャーだけをエクスポート
expdp scott/tiger \
directory=DATA_PUMP_DIR \
dumpfile=emp_mgr10.dmp \
logfile=emp_mgr10.log \
tables=emp \
query="WHERE deptno = 10 AND job = 'MANAGER'"
LIKEやINを使った条件
Shell — IN / LIKE を使った絞り込み例
# IN 句で複数の部署を指定
expdp scott/tiger directory=DATA_PUMP_DIR dumpfile=emp_multi.dmp \
logfile=emp_multi.log tables=emp \
query="WHERE deptno IN (10, 20, 30)"
# LIKE で名前が S から始まる社員を指定
expdp scott/tiger directory=DATA_PUMP_DIR dumpfile=emp_s.dmp \
logfile=emp_s.log tables=emp \
query="WHERE ename LIKE 'S%'"
複数テーブルに個別のWHERE条件を指定する
複数テーブルを同時にエクスポートする場合、テーブルごとに異なる条件を指定するには テーブル名:"WHERE 条件" の形式を使います。
Shell — テーブルごとに異なるWHERE条件を指定
expdp scott/tiger \
directory=DATA_PUMP_DIR \
dumpfile=multi_table.dmp \
logfile=multi_table.log \
tables=emp,dept \
query='emp:"WHERE deptno=10" dept:"WHERE deptno IN (10,20)"'
注意: 複数テーブルへの個別条件指定は、クォートのネストが複雑になりやすいため、後述の parfileを使う方法を推奨します。
parfile(パラメータファイル)を使う方法
クォートが複雑になる場合や条件が長い場合は、パラメータファイル(parfile)を使うとコマンドをシンプルに保てます。
File — export_emp.par(パラメータファイルの例)
directory=DATA_PUMP_DIR
dumpfile=emp_dept10.dmp
logfile=emp_dept10.log
tables=emp
query="WHERE deptno = 10 AND hiredate >= TO_DATE('2020-01-01','YYYY-MM-DD')"
Shell — parfileを指定してexpdpを実行
expdp scott/tiger parfile=/home/oracle/export_emp.par
ヒント: parfileはOracle Directoryを通じた領域ではなく、OSのファイルパスで直接指定します。クォートのネスト問題を完全に回避でき、複数テーブルへの個別条件指定も1行ずつ書けるため管理が楽になります。
OSごとのクォートの扱い
queryパラメータはOSのシェルによってクォートの書き方が異なります。
| OS |
推奨書き方 |
注意点 |
| Linux / Unix |
query=”WHERE col=’val'” |
外側ダブルクォート、内側はエスケープしたシングルクォート |
| Windows CMD |
query=”WHERE col=’val'” |
シングルクォートを2つ連続で書くことでエスケープ |
| Windows PowerShell |
parfileを使う |
クォート干渉が多いためparfile推奨 |
| 共通(推奨) |
parfile=xxx.par |
OS依存なし、最も安全 |
Linux での文字列条件の書き方例
Shell (Linux) — シングルクォートのエスケープ
expdp scott/tiger directory=DATA_PUMP_DIR dumpfile=emp.dmp \
logfile=emp.log tables=emp \
query="WHERE job = \'MANAGER\'"
Windows CMD での文字列条件の書き方例
CMD (Windows) — シングルクォートを2つ連続でエスケープ
expdp scott/tiger directory=DATA_PUMP_DIR dumpfile=emp.dmp logfile=emp.log tables=emp query="WHERE job = ''MANAGER''"
よくあるエラーと対処法
| エラー / 症状 |
原因 |
対処法 |
| ORA-39014 |
queryの構文エラー(クォート不正など) |
parfileを使い条件を直接記述する |
| 0行エクスポートされる |
条件が正しくパースされていない |
先にSQLPlusで同じWHERE条件を確認する |
| 特殊文字(>, <, &)が消える |
シェルが特殊文字を解釈してしまう |
parfileに記述するか、シングルクォートで全体を囲む |
| 複数テーブルで条件が適用されない |
テーブル名:条件 の書き方が間違っている |
parfileで1行ずつ query=テーブル名:”WHERE…” と記述する |
queryパラメータの制限事項
制限事項まとめ:
- queryパラメータは
CONTENT=DATA_ONLY または CONTENT=ALL 時のみ有効(DDLのみのエクスポートには使用不可)
- クラスタ表・ネスト表・外部表など一部の表タイプはqueryパラメータが使用できない場合がある
- サブクエリ内で対象テーブルの列名のみ参照可能(他テーブルへのJOINは不可)
- queryで指定した条件に合わなくても、LOBやBFILE等の付随データはエクスポートされない
まとめ
| ユースケース |
推奨の書き方 |
| 単純な数値・日付条件 |
query=”WHERE col = 値” |
| 文字列条件(Linux) |
query=”WHERE col = ‘値'” |
| 文字列条件(Windows CMD) |
query=”WHERE col = ‘値'” |
| 複数テーブルに個別条件 |
parfileを使い1行ずつ記述 |
| 条件が複雑・特殊文字あり |
必ずparfileを使用 |
よくある質問(FAQ)
Q. queryパラメータとFLASHBACK_TIMEは同時に使えるか?
A. 使えます。FLASHBACK_TIMEやFLASHBACK_SCNと組み合わせることで、「特定の過去時点のデータかつ特定条件」でエクスポートすることが可能です。
Q. WHERE句でサブクエリ(SELECT)を使えるか?
A. 使えますが、サブクエリ内で参照できるのはエクスポート対象テーブル自身の列のみです。他スキーマや他テーブルを参照するサブクエリは動作しない場合があります。
Q. impdpのインポート時にもqueryで絞り込みできるか?
A. impdpにはqueryパラメータがありません。インポート時の絞り込みはREMAP_TABLEやINCLUDE/EXCLUDEパラメータで対応し、データの絞り込みはエクスポート側のqueryで行うのが基本です。