Начиная с Oracle 9i, существует два способа или объявление каталога для использования с UTL_FILE.
Более старый способ - установить параметр INIT.ORA UTL_FILE_DIR. Мы должны перезапустить базу данных, чтобы изменения вступили в силу. Значение может соответствовать любой другой переменной PATH; он принимает подстановочные знаки. Использование этого подхода означает передачу пути к каталогу ...
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
Альтернативный подход заключается в объявлении объекта каталога.
create or replace directory temp_dir as 'C:\temp'
/
grant read, write on directory temp_dir to vineet
/
Объекты каталога требуют точного пути к файлу и не принимают подстановочные знаки. При таком подходе мы передаем имя объекта каталога ...
UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');
UTL_FILE_DIR устарела, поскольку по своей сути небезопасна - все пользователи имеют доступ ко всем каталогам ОС, указанным в пути, тогда как права на чтение и запись могут быть предоставлены отдельным пользователям отдельно. Кроме того, с помощью объектов Каталога мы можем добавлять, удалять или изменять каталоги, не возвращая базу данных.
В любом случае пользователь ОС oracle
должен иметь права чтения и / или записи в каталоге ОС . Если это не очевидно, это означает, что каталог должен быть виден с сервера базы данных . Таким образом, мы не можем использовать любой из этих подходов для предоставления каталога на локальном ПК процессу, выполняющемуся на удаленном сервере базы данных. Файлы должны быть загружены на сервер базы данных или на общий сетевой диск.
Если пользователь ОС oracle
не имеет соответствующих привилегий в каталоге ОС, или если путь, указанный в базе данных, не соответствует фактическому пути, программа выдаст это исключение:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
Текст OERR для этой ошибки довольно ясен:
29283 - "invalid file operation"
*Cause: An attempt was made to read from a file or directory that does
not exist, or file or directory access was denied by the
operating system.
*Action: Verify file and directory access privileges on the file system,
and if reading, verify that the file exists.