はじめに
Data Pump等を使用した際に、ディレクトリ内に複数のファイルが作成され、ファイルを一つ一つ削除するのは面倒な場合があります。
そんな時に使えそうな、特定のディレクトリ内の全ファイルを一撃で消す方法をご紹介します。
ディレクトリ内のファイルの一覧を表示
まずは現在のディレクトリDATA_PUMP_DIR内のファイルの一覧を表示してみます。
DBMS_CLOUD.LIST_FILESファンクションを使用します。
SQL> SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');
OBJECT_NAME BYTES CHECKSUM CREATED LAST_MODIFIED
_______________ __________ ___________ ______________________________________ ______________________________________
exp02.dmp 274432 22-DEC-23 09.09.54.381150000 AM GMT 22-DEC-23 09.09.55.506786000 AM GMT
expdp02.dmp 28672 22-DEC-23 09.12.06.853427000 AM GMT 22-DEC-23 09.12.21.623613000 AM GMT
expdp101.dmp 32768 22-DEC-23 09.14.52.073214000 AM GMT 22-DEC-23 09.15.45.559141000 AM GMT
expdp104.dmp 32768 22-DEC-23 09.15.05.567620000 AM GMT 22-DEC-23 09.15.45.555805000 AM GMT
export.log 2039 22-DEC-23 09.09.27.321014000 AM GMT 22-DEC-23 09.15.47.640452000 AM GMT
exp01.dmp 12288 22-DEC-23 09.09.27.591345000 AM GMT 22-DEC-23 09.09.57.816385000 AM GMT
exp03.dmp 28672 22-DEC-23 09.09.54.488724000 AM GMT 22-DEC-23 09.09.57.824931000 AM GMT
exp04.dmp 12288 22-DEC-23 09.09.55.595007000 AM GMT 22-DEC-23 09.09.57.821460000 AM GMT
expdp01.dmp 274432 22-DEC-23 09.11.48.593315000 AM GMT 22-DEC-23 09.12.08.179151000 AM GMT
expdp03.dmp 12288 22-DEC-23 09.12.08.010860000 AM GMT 22-DEC-23 09.12.09.211921000 AM GMT
expdp102.dmp 24576 22-DEC-23 09.15.04.228428000 AM GMT 22-DEC-23 09.15.45.559179000 AM GMT
expdp103.dmp 1925120 22-DEC-23 09.15.04.606600000 AM GMT 22-DEC-23 09.15.45.561670000 AM GMT
12 rows selected.
SQL>
ディレクトリDATA_PUMP_DIR内には12個のファイルがあることが確認できました。
ディレクトリ内のファイルを一括削除するPL/SQL
こちらのPL/SQLブロックを実行することで、ディレクトリ内の全てのファイルを一括で削除することができます。
BEGIN
FOR rec in (SELECT object_name FROM DBMS_CLOUD.LIST_FILES('ディレクトリ名'))
LOOP
DBMS_CLOUD.DELETE_FILE(directory_name => 'ディレクトリ名', file_name => rec.object_name);
END LOOP;
END;
ディレクトリ名にDATA_PUMP_DIRを指定して、早速実行してみます。
SQL> BEGIN
2 FOR rec in (SELECT object_name FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR'))
3 LOOP
4 DBMS_CLOUD.DELETE_FILE(directory_name => 'DATA_PUMP_DIR', file_name => rec.object_name);
5 END LOOP;
6 END;
7* /
PL/SQL procedure successfully completed.
SQL>
実行結果の確認
再度、DBMS_CLOUD.LIST_FILESファンクションを使用して、ディレクトリDATA_PUMP_DIRの内容を確認してみます。
SQL> SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');
no rows selected
SQL>
ディレクトリDATA_PUMP_DIR内の全てのファイルが削除されていることがわかりました。
なお、FOR文の中のSELECT文に WHERE object_name LIKE 'exp%' 等の検索条件を付加することで、特定のファイル名を持つファイルのみを削除することも可能です。