utl_file fopen - я не могу записать текст в файл
Недавно я обновил версию для БД до Oracle 11G. С этого момента запись в файл не выполняется.
Мой код:
UTL_FILE.FOPEN('/tmp', 'file.txt', 'w');
Я получил "ora-29280 неверный путь к каталогу"
Я знаю, что должен использовать с Oracle DIRECTORY ("создать каталог..."), но в Oracle 10G он прекрасно работал с явным путем, и я не хочу менять свой код.
Благодарю.
1 ответ
Нет, ты не можешь.. Документ говорит это!
Обходной путь мог бы использовать ALL_DIRECTORIES для /tmp и затем использовать его в FOPEN
SELECT DIRECTORY_NAME INTO MY_DIR FROM ALL_DIRECTORIES WHERE DIRECTORY_PATH='/tmp';
UTL_FILE.FOPEN(MY_DIR, 'file.txt', 'w');
Похоже, что Oracle больше не поддерживает прямой путь к файлу из соображений безопасности.
Каталог должен быть создан правильно, прежде чем вручную.
CREATE OR REPLACE DIRECTORY TEMP AS '/tmp'
/
GRANT READ, WRITE ON DIRECTORY TEMP TO MYUSER
/
Вы можете написать функцию, которая будет возвращать запрошенное имя каталога БД для полного запрошенного пути. И вернуть имя каталога по умолчанию в случае недоступности.
РЕДАКТИРОВАТЬ: UTL_FILE_DIR может использоваться для жестко закодированных путей Справочника. При условии, что параметр INIT.ORA имеет эти пути к каталогам. Иначе, это должно быть добавлено, и база данных должна быть возвращена.
Ссылка ниже содержит некоторую полезную информацию о том, как ее использовать, и плюсы использования объектов Справочника вместо жестко закодированных путей!
http://www.otnblogs.com/using-oracle-directories-instead-utl_file_dir/