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/

Другие вопросы по тегам