Существует два способа указания целевых каталогов ОС для UTL_FILE. Метод, который вы используете - путь к ОС - более старый. При использовании реальных путей нам нужно включить их в параметр UTL_FILE в файле INIT.ORA (или в spfile). Это боль в шее, потому что база данных должна возвращаться каждый раз, когда мы меняем параметр.
Вместо этого можно использовать объект каталога.
create or replace directory whatever as
'/dhiusr3/sub/cng/cngwrk18/var/m3g/projs/up/data/MAF_SMS/20091216/13/15490000'
/
grant read, write on directory whatever to benjamin
/
Эти операторы должны выполняться пользователем с привилегией CREATE ANY DIRECTORY (возможно, администратором баз данных).
Преимущество использования каталогов состоит в том, что мы можем создавать объекты каталогов без отскока базы данных. Это также облегчает обслуживание, поскольку нам нужно изменить путь только в одном месте (хотя это не относится к вашему случаю).
Одно преимущество более старого метода обработки путей состоит в том, что мы можем использовать * в параметре UTL_FILE_DIR, чтобы мы могли указывать поддеревья. Мы должны явно объявить отдельный объект Каталога для каждого каталога. Многие люди считают гибкость UTL_FILE_DIR в этом отношении скорее ошибкой безопасности, чем преимуществом. Помимо всего прочего, каталоги, предоставляемые UTL_FILE_DIR, фактически предоставляются PUBLIC, в то время как мы можем предоставлять определенные привилегии для объектов Каталога с гораздо более низким уровнем детализации.
Независимо от того, какой подход мы выбираем целевой каталог, крайне важно, чтобы пользователь ОС oracle
имел необходимый уровень доступа. Другими словами, если пользователь ОС oracle
не может записать (или прочитать) файл в этом каталоге в unix, UTL_FILE бросит ORA-29280: invalid directory path
.
Не уверен, будет ли косая черта проблемой. Оператору CREATE DIRECTORY все равно, подход с именованным путем может быть более сложным. Но это, конечно, не обязательно.