ORA-29283: "SYS"에서 잘못된 파일 작업 ORA-06512:.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;
이 코드는 우리의 개발 데이터베이스에서 정상적으로 작동하지만, 새로운 DB에서 실행하면 아래 오류가 발생합니다.
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
이 문제를 해결할 수 있도록 도와주세요.
여러분, 이 문제를 해결하기 위해 저에게 더 많은 자료가 필요하시면 말씀해주세요.
따라서 @Vivek는 실제 답변이 아닌 댓글의 대화를 통해 문제의 해결책을 얻었습니다.
"사용자가 파일을 만들고 있습니다.
oracle방금 우리 개발 데이터베이스에서 이것을 발견했습니다.이 오류가 발생하는 이유는 파일을 생성하려는 디렉토리에 대한 쓰기 액세스 권한이 없기 때문입니다.others및 사용자oracle밑으로 떨어지다others카테고리."
이 질문에 대한 승인된 답변이 없을 때, 저는 다음 주제에 대한 저의 답변에 대한 링크를 제공합니다.UTL_FILE.FOPEN()여기서 찾으세요.
추신. 저는 이 대답을 커뮤니티 위키에 표시하고 있습니다. 왜냐하면 이 질문에 대한 적절한 대답이 아니기 때문입니다. 단지 다른 곳으로 방향을 전환하는 것뿐입니다.
이름이 "인 미리 정의된 디렉토리에 파일이 이미 생성되어 있다고 가정합니다.table.txt"
파일 소유권 변경:
sudo chown username:username table.txt파일 모드 변경
sudo chmod 777 table.txt
이제, 효과가 있을 거예요!
Windows에서는 파일이 EFS를 사용하여 암호화되지 않았는지도 확인합니다.파일을 수동으로 해독하기 전까지 동일한 문제가 있었습니다.
이틀 동안 이 문제에 직면했는데 Oracle에서 생성하는 디렉터리도 물리적 Disk에 먼저 생성해야 한다는 것을 알게 되었습니다.
저는 이 문제에 대한 해결책을 찾으려 했던 어느 곳에서도 이 점이 언급되지 않았습니다.
예
디렉토리를 작성한 경우, '라고 가정합니다.DB_DIR'.
CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DB_WORKS';
그렇다면 당신은 그것을 확인해야 합니다.DB_WORKS에 존재합니다.E:\Oracle 프로세스에서는 드라이브 및 파일 시스템 수준 읽기/쓰기 권한을 사용할 수 있습니다.
이러한 작업에 대한 제 경험으로 UTL_FILE에 대한 이해는 아래와 같습니다.
UTL_FILE은 SYS 사용자의 개체입니다.SYS에 대한 GRANT EXECUTE ON SYSYS.UTL_FILE TO Public. SYS로 로그인한 동안 제공해야 합니다.그렇지 않으면 절차에 선언 오류가 발생합니다.누구나 다음과 같이 디렉토리를 작성할 수 있습니다. - 디렉토리 DB_DIR'E:\DB작업'; 그러나 디렉토리 생성 권한이 있어야 합니다.다음과 같이 부여할 수 있습니다. - SYS 사용자로 로그인한 상태에서 사용자에게 GRANT CREATE ALL DIRECTORY TO user.그러나 다른 사용자가 이 권한을 사용해야 하는 경우 해당 사용자에게 권한을 부여해야 합니다. 그렇지 않으면 오류가 발생합니다.디렉터리를 만든 사용자로 로그인한 동안 DB_DIR에서 읽기, 쓰기, 실행 권한을 사용자에게 부여합니다.그런 다음 패키지를 컴파일합니다.절차를 실행하기 전에 디렉토리가 디스크에 물리적으로 존재하는지 확인합니다.그렇지 않으면 'Invalid File Operation' 오류가 발생합니다. (V. IMPORTICAL) Oracle 프로세스에 대해 파일 시스템 수준 읽기/쓰기 권한이 있는지 확인하십시오.이것은 부여된 DB 수준 권한과는 별개입니다.(V. 중요) 절차를 실행합니다.파일이 쿼리 결과 집합으로 채워져야 합니다.
그ORA-29283: invalid file operation에 대해서도 제기됩니다.utl_file.put다음보다 긴 줄을 쓰려는 시도가 있는 경우max_linesize텍스트 모드로max_linesize는 1024로 기본 설정된 함수의 4번째 매개 변수입니다.
(제 사례는 Docker의 Oracle 내에서 Docker 볼륨으로 매핑된 호스트 디렉토리의 파일로 CSV를 덤프하는 것이었습니다. 상당한 시간 동안 이 오류로 인해 잘못 이끌렸습니다. Docker와 호스트 간의 파일 시스템 권한 또는 볼륨 매핑에서 원인을 찾았지만 실제로는 너무 어리석은 원인이었습니다.)
가 또 했습니다.utl_file.fopen이전에 파일이 없었던 경우에도 데이터베이스가 파일 작성을 거부했습니다.파일 생성 시도가 발생한 디렉토리가 Docker 볼륨에 매핑되었습니다.호스트 시스템에 미리 크기가 0인 파일이 생성된 경우 작동하기 시작했습니다.합니다.touch /dir/file하지만 실패했습니다.도커 문제일 수 있습니다. 도커 데스크톱을 다시 시작한 후 사라졌습니다.
폴더를 만들어 권한을 부여해야 합니다.
디렉토리 DIINESH를 '/home/oracle/DIINESH/'로 만들거나 바꿉니다.
공공에 읽기, 쓰기를 DIINESH 디렉토리에 부여합니다.
파일을 열고 파일에 두 줄을 쓴 후 파일 선언을 닫습니다.
fhandleutl_file.file_type;
시작한다.
fhandle := utl_file.fopen(
'DINESH' -- File location
, 'test_file.txt' -- File name
, 'w' -- Open mode: w = write.
);
utl_file.put(fhandle, 'Hello world!' || 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./home/oracle/DIINESH에 txt 파일이 생성되었습니다.
언급URL : https://stackoverflow.com/questions/6014884/ora-29283-invalid-file-operation-ora-06512-at-sys-utl-file-line-536
'codememo' 카테고리의 다른 글
| Spring Framework를 사용하여 OPTIONS 요청에 대한 CORS 사용 (0) | 2023.08.16 |
|---|---|
| "SqlParameterCollection은 Null이 아닌 SqlParameter 유형 개체만 허용하고 String 개체는 허용하지 않습니다." (0) | 2023.08.16 |
| 도커는 lxc-tools(사용자 공간 LXC 도구)에 무엇을 추가합니까? (0) | 2023.08.16 |
| 도커에서 디렉터리 명령을 변경하시겠습니까? (0) | 2023.08.16 |
| 최대 길이로 최대 절전 모드에서 열의 길이를 설정하는 방법 (0) | 2023.08.16 |