ORA-29283: недопустимая файловая операция ORA-06512: в "SYS.UTL_FILE", строка 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
Пожалуйста, помогите мне решить эту проблему.
Ребята, пожалуйста, дайте мне знать, если вам нужно больше данных от меня, чтобы решить этот вопрос.
7 ответов
Таким образом, @Vivek получил решение проблемы с помощью диалога в комментариях, а не путем фактического ответа. Кто сказал, что сайт вопросов и ответов не форум? Э, я, среди других.
Во всяком случае, в отсутствие принятого ответа на этот вопрос я предлагаю ссылку на мой ответ на тему UTL_FILE.FOPEN()
, Найдите это здесь.
PS Я отмечаю этот ответ вики-сообществом, потому что это не правильный ответ на этот вопрос, а просто перенаправление в другое место.
Предположим, файл уже создан в предопределенном каталоге с именем "table.txt". 1. Измените владельца файла sudo chown {ваше имя пользователя}: {ваше имя пользователя} table.txt. 2. Измените режим файла sudo chmod 777 table..текст
сейчас попробуй это должно сработать!!!!
Я сталкивался с этой проблемой в течение двух дней и обнаружил, что каталог, который вы создаете в Oracle, также необходимо сначала создать на вашем физическом диске. Я нигде не упоминал об этом, я пытался найти решение этой проблемы.
т.е.
Если вы создали каталог, скажем, "DB_DIR".
CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DB_WORKS';
Затем вам нужно убедиться, что DB_WORKS существует на вашем диске E:\, а также для доступа к процессу Oracle доступны разрешения на чтение / запись на уровне файловой системы.
Мое понимание UTL_FILE из моего опыта приведено ниже для такого рода операций.
UTL_FILE - объект под пользователем SYS. GRANT EXECUTE ON SYS.UTL_FILE TO PUBLIC; необходимо дать, пока вы вошли в систему как SYS. Иначе, это даст ошибку объявления в процедуре. Любой может создать каталог, как показано:- СОЗДАТЬ ИЛИ ЗАМЕНИТЬ КАТАЛОГ DB_DIR AS 'E:\DBWORKS'; Но разрешение CREATE DIRECTORY должно быть на месте. Это может быть предоставлено, как показано:- GRANT CREATE ALL DIRECTORY пользователю; во время входа в систему как пользователь SYS. Однако, если это нужно использовать другому пользователю, ему должны быть предоставлены права, в противном случае он выдаст ошибку. GRANT READ, WRITE, EXECUTE ON DB_DIR TO пользователю; во время входа в систему как пользователь, который создал каталог. Затем скомпилируйте ваш пакет. Перед выполнением процедуры убедитесь, что каталог физически существует на вашем диске. В противном случае он выдаст ошибку "Недопустимая операция с файлом". (V. ВАЖНО) Убедитесь, что для процесса Oracle установлены разрешения на чтение и запись на уровне файловой системы. Это отдельно от предоставленных разрешений уровня БД. (V. ВАЖНО) Выполните процедуру. Файл должен заполняться набором результатов вашего запроса.
Решение Предположим, что файл уже создан в предопределенном каталоге с именем "table.txt"
- сменить владельца файла:
sudo chown имя пользователя: имя пользователя table.txt2) изменить режим файла
sudo chmod 777 table.txt Теперь попробуйте, он должен работать!
НЕ РАБОТАЕТ! Проверить перед публикацией бесполезный код
The
ORA-29283: invalid file operation
также поднимается на
utl_file.put
если есть попытка написать строку длиннее, чем в текстовом режиме.
max_linesize
является необязательным 4-м параметромфункция по умолчанию 1024.
(Мой случай заключался в сбросе CSV из Oracle в Docker в файл в каталоге хоста, отображаемом как том Docker, и я был введен в заблуждение этой ошибкой довольно значительное время - я искал причину в правах файловой системы или сопоставлении томов между Docker и хостом, на самом деле это было так глупая причина)
ОБНОВЛЕНИЕ: другое возникновение того же исключения также произошло
utl_file.fopen
. База данных отклонила создание файла, даже если этот файл ранее не существовал. Каталог, в котором произошла попытка создания файла, был сопоставлен с томом Docker. Это начинало работать, если файл нулевого размера был создан на хост-компьютере заранее. Попытка создать файл из контейнера (
touch /dir/file
) однако не удалось. Возможно, какая-то проблема с докером — она исчезла после перезапуска Docker Desktop.
Вам нужно дать разрешение, создав папку.
создать или заменить каталог DINESH на '/home/oracle/DINESH/';
разрешить чтение, запись в каталоге DINESH для публики;
Простой PLSQL для открытия файла -- запись двух строк в файл -- и закрытие файла
fhandle utl_file.file_type;
начинать
fhandle := utl_file.fopen(
'DINESH' -- File location
, 'test_file.txt' -- File name
, 'w' -- Open mode: w = write.
);
utl_file.put(fhandle, 'Привет, мир!'|| CHR(10));
utl_file.put(fhandle, 'Hello again!');
utl_file.fclose(fhandle);
исключение
when others then
dbms_output.put_line('ERROR: ' || SQLCODE || ' - ' || SQLERRM);
raise;
конец;
- Файл test_file.txt, созданный в /home/oracle/DINESH.
В Windows также проверьте, не зашифрован ли файл с помощью EFS. У меня была такая же проблема, пока я не расшифровал файл вручную.