UTL_FILE.FOPEN () процедура, не принимающая путь для каталога?

Я пытаюсь записать в файле, хранившем в c:\ drive named vin1.txt, и добираюсь, эта ошибка.Please предлагают!

> ERROR at line 1: ORA-29280: invalid
> directory path ORA-06512: at
> "SYS.UTL_FILE", line 18 ORA-06512: at
> "SYS.UTL_FILE", line 424 ORA-06512: at
> "SCOTT.SAL_STATUS", line 12 ORA-06512:
> at line 1

ВОТ код

  create or replace procedure sal_status
   (
    p_file_dir IN varchar2,
    p_filename IN varchar2)
     IS  
    v_filehandle utl_file.file_type;
    cursor emp Is
        select * from employees
        order by department_id;
    v_dep_no departments.department_id%TYPE;
     begin
         v_filehandle :=utl_file.fopen(p_file_dir,p_filename,'w');--Opening a file
         utl_file.putf(v_filehandle,'SALARY REPORT :GENERATED ON %s\n',SYSDATE);
         utl_file.new_line(v_filehandle);
         for v_emp_rec IN emp LOOP
            v_dep_no :=v_emp_rec.department_id;
            utl_file.putf(v_filehandle,'employee %s earns:s\n',v_emp_rec.last_name,v_emp_rec.salary);                    
         end loop;
        utl_file.put_line(v_filehandle,'***END OF REPORT***');
        UTL_FILE.fclose(v_filehandle);
     end sal_status;

execute sal_status('C:\','vin1.txt');--Executing
24
задан APC 2 May 2010 в 13:00
поделиться

3 ответа

Начиная с 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.
37
ответ дан 28 November 2019 в 23:08
поделиться

Вам необходимо, чтобы ваш администратор баз данных изменил файл init.ora, добавив каталог, к которому вы хотите получить доступ, в параметр 'utl_file_dir'. Затем ваш экземпляр базы данных необходимо будет остановить и перезапустить, потому что init.ora читается только при запуске базы данных.

Вы можете просмотреть (но не изменить) этот параметр, выполнив следующий запрос:

SELECT *
  FROM V$PARAMETER
  WHERE NAME = 'utl_file_dir'

Поделитесь и наслаждайтесь.

0
ответ дан 28 November 2019 в 23:08
поделиться

Вам нужно зарегистрировать каталог в Oracle. fopen принимает имя объекта каталога, а не путь. Например:

(вам может потребоваться войти в систему sys для их выполнения)

CREATE DIRECTORY MY_DIR AS 'C:\';

GRANT READ ON DIRECTORY MY_DIR TO SCOTT;

Затем вы можете обратиться к нему в вызове fopen:

execute sal_status('MY_DIR','vin1.txt');
4
ответ дан 28 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: