残念ながら、BADFILE、LOGFILE、および DISCARDFILE パラメータだけを変更しても、他のアクセス パラメータも再指定する必要はありません。
それが価値があるものであり、将来この質問を見つけた人のために、私は最終的に次の方法で問題を回避しました:
外部テーブルを選択し、そのアクセス パラメータで REGEXP_REPLACE を使用して、BADFILE、LOGFILE、および DISCARDFILE とそれらの関連値に一致するアクセス パラメータ BLOB の部分を、指定した新しい値に置き換えます。
CURSOR external_table_cur(
cp_external_table IN VARCHAR2,
cp_new_log_dir IN VARCHAR2,
cp_log_file IN VARCHAR2
)
IS
SELECT table_name,
REGEXP_REPLACE(
access_parameters,
<REGEX PATTERN>,
cp_new_log_dir||':'''||LOWER(cp_log_file),
1,
0,
'i'
) AS new_access_params
FROM all_external_tables
WHERE table_name = UPPER(cp_external_table);
次に、動的 SQL を使用して外部テーブルを変更し、新しいアクセス パラメータを指定しました。
-- Point external table to new file, directory and access params
EXECUTE IMMEDIATE(
'ALTER TABLE '
|| p_table_name
|| ' DEFAULT DIRECTORY '
|| p_directory
|| ' LOCATION ('''
|| p_filename
|| ''') '
|| ' ACCESS PARAMETERS ('
|| TO_CHAR(new_access_params)
|| ')'
);
これは理想的ではなく、最終的にすべてのアクセス パラメータを再指定する必要がありましたが、REGEX を使用する (そして出力を完全にテストする) ことで、プロセスがそれほど面倒でも遅くもありませんでした。