К сожалению, изменение только параметров BADFILE, LOGFILE и DISCARDFILE не может быть достигнуто без необходимости повторной настройки других параметров доступа.
Для чего стоит и для любого, кто найдет этот вопрос в будущем, я в конечном итогеобошла проблему с помощью следующего:
Выберите внешнюю таблицу и используйте REGEXP_REPLACE в ее параметрах доступа для замены частей параметра доступа BLOB, которые соответствуют BADFILE, LOGFILE и DISCARDFILE, и их связанных значений новыми значениями, которыеЯ предоставил.
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 (и полного тестирования вывода) означали, что процесс не был слишком болезненным или медленным.