ORA-29283: недопустимая файловая операция ORA-06512: at " SYS.Файл UTL", строка 536

ниже код я использую для извлечения данных из таблицы в плоский файл.

BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

этот код отлично работает в нашей базе данных разработки, но его выбрасывание ниже ошибки, если я выполняю в новой БД.

Error starting at line 1 in command:
    BEGIN
    DECLARE
        file_name VARCHAR2(50);
        file_handle utl_file.file_type;
BEGIN
    file_name := 'table.txt';
    file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
    SELECT            column 1
                ||'~'||column 2
                ||'~'||column 3 out_line
    FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;

Error report:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7
29283. 00000 -  "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.

Oracle directory 'SEND' points to some UNIX directory which has rights as 
       'rwxrwsr-x' (Octal 2775)
Oracle Version:11g

пожалуйста, помогите мне решить эту проблему.

Ребята, пожалуйста, дайте мне знать, если вам потребуется больше информации от меня, чтобы решить этот вопрос.

4 ответов


Итак, @Vivek получил решение проблемы через диалог в комментариях, а не через фактический ответ. Кто говорит, что сайт Q&A не является форумом? Э-э, я, среди прочих.

в любом случае, при отсутствии принятого ответа на этот вопрос я предлагаю ссылку на мой ответ на тему UTL_FILE.FOPEN(). найти здесь.

П. С. Я отмечаю этот ответ Вики сообщества, потому что это не правильный ответ на этот вопрос, просто редирект в другое место.


я столкнулся с этой проблемой в течение двух дней, и я обнаружил, что каталог, который вы создаете в Oracle, также должен быть создан сначала на вашем физическом диске. Я не нашел этот момент, упомянутый нигде, я попытался найти решение для этого.

то есть

Если вы создали каталог, скажем, 'DB_DIR'.

CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DB_WORKS';

затем вам нужно убедиться, что DB_WORKS существует на вашем диске E:\, а также разрешения на чтение/запись на уровне файловой системы доступны Oracle процесс.

мое понимание UTL_FILE из моего опыта приведено ниже для такого рода операций.

UTL_FILE-это объект под пользователем SYS. ГРАНТ ВЫПОЛНИТЬ НА SYS.UTL_FILE ДЛЯ PUBLIC; необходимо указать при входе в систему как SYS. В противном случае, это будет дайте ошибку объявления в процедуре. Любой может создать каталог как показано: - создать или заменить каталог DB_DIR как 'E:\DBWORKS'; но создать Разрешение каталога должно быть на месте. Это может быть предоставлено как показано: - GRANT создать весь каталог для пользователя; при входе в систему как SYS пользователь. Однако, если это необходимо использовать другому пользователю, необходимо предоставить гранты чтобы быть предоставленным этому пользователю, иначе он выдаст ошибку. ГРАНТ ЧИТАТЬ, Напишите, выполните на DB_DIR к потребителю; пока loggedin как потребитель который создал каталог. Затем скомпилируйте свой пакет. Перед выполнением процедура, убедитесь, что каталог существует физически на вашем Диск. В противном случае он выдаст ошибку "недопустимая операция с файлом". (В. ВАЖНЫЙ) Убедитесь, что на уровне файловой системы имеются разрешения на чтение и запись место для процесса Oracle. Это отдельно от уровня DB разрешения.(В. Важно) выполнить процедуру. Файл должен получить заполняется результирующим набором запроса.


в Windows Также проверьте, не зашифрован ли файл с помощью EFS. У меня была та же проблема, пока я не расшифровал файл вручную.


предположим, что файл уже создан в предопределенном каталоге с именем "таблица".формат txt" 1. изменение владельца файла sudo chown {ваше имя пользователя}: {ваше имя пользователя} таблица.формат txt 2-е изменение режима работы файла судо команду chmod 777 стол.txt

теперь попробуйте это должно сработать!!!!