【Oracle】expdpでWHERE句(queryパラメータ)を使って一部データをエクスポートする方法|複数テーブル・parfile・クォート対策まで完全解説

【Oracle】expdpでWHERE句を使って一部データだけをエクスポートする方法 Oracle

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_TIMEFLASHBACK_SCNと組み合わせることで、「特定の過去時点のデータかつ特定条件」でエクスポートすることが可能です。

Q. WHERE句でサブクエリ(SELECT)を使えるか?
A. 使えますが、サブクエリ内で参照できるのはエクスポート対象テーブル自身の列のみです。他スキーマや他テーブルを参照するサブクエリは動作しない場合があります。

Q. impdpのインポート時にもqueryで絞り込みできるか?
A. impdpにはqueryパラメータがありません。インポート時の絞り込みはREMAP_TABLEINCLUDE/EXCLUDEパラメータで対応し、データの絞り込みはエクスポート側のqueryで行うのが基本です。