UTL_FILE.FOPEN() 프로시저가 디렉터리 경로를 수락하지 않습니까?
c:\drive에 저장된 vin1이라는 파일에 쓰려고 합니다.txt 및 이 오류가 발생합니다.제안해주세요!
> 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
Oracle 9i 이후에는 UTL_FILE과 함께 사용할 디렉토리를 선언하는 두 가지 방법이 있습니다.
이전 방법은 INIT.ORA 매개 변수 UTL_FILE_DIR을 설정하는 것입니다.변경 내용을 적용하려면 데이터베이스를 다시 시작해야 합니다.값은 다른 PATH 변수와 유사할 수 있으며 와일드카드를 사용할 수 있습니다.이 접근 방식을 사용하는 것은 디렉터리 경로를 전달하는 것을 의미합니다...
UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');
9i에 도입된 대안적인 접근법은 디렉터리 개체를 선언하는 것입니다.
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은 본질적으로 안전하지 않기 때문에 더 이상 사용되지 않습니다. 모든 사용자는 경로에 지정된 모든 OS 디렉토리에 액세스할 수 있지만 디렉터리 개체에 대한 읽기 및 쓰기 권한은 개별 사용자에게 개별적으로 부여될 수 있습니다.또한 디렉터리 개체를 사용하면 데이터베이스를 바운스하지 않고 디렉터리를 추가, 제거 또는 변경할 수 있습니다.
어느 경우든,oracle
OS 사용자는 OS 디렉토리에 대한 읽기 및/또는 쓰기 권한이 있어야 합니다.명확하지 않은 경우, 이것은 데이터베이스 서버에서 디렉토리를 볼 수 있어야 한다는 것을 의미합니다.따라서 로컬 PC의 디렉터리를 원격 데이터베이스 서버에서 실행 중인 프로세스에 노출하는 데 두 가지 방법을 모두 사용할 수 없습니다.파일을 데이터베이스 서버 또는 공유 네트워크 드라이브에 업로드해야 합니다.
만약에oracle
OS 사용자에게 OS 디렉토리에 대한 적절한 권한이 없거나 데이터베이스에 지정된 경로가 실제 경로와 일치하지 않으면 프로그램에서 다음 예외를 발생시킵니다.
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.
Oracle 18c부터 UTL_FILE_DIR은 이전 버전과의 호환성을 제외하고는 지원되지 않습니다.
파일 경로는 저장 프로시저를 호출할 수 있는 로컬 개발 시스템이 아니라 실제 오라클 서버 시스템에 있다는 점도 잊지 마십시오.이것은 아마도 매우 명백하지만 기억해야 할 것입니다.
디렉토리를 Oracle에 등록해야 합니다.fopen은 경로가 아닌 디렉터리 개체의 이름을 사용합니다.예:
(이를 실행하려면 SYS로 로그인해야 할 수도 있습니다.)
CREATE DIRECTORY MY_DIR AS 'C:\';
GRANT READ ON DIRECTORY MY_DIR TO SCOTT;
그런 다음 열기 전화에서 이를 참조할 수 있습니다.
execute sal_status('MY_DIR','vin1.txt');
디렉토리 이름은 대소문자를 구분하는 것 같습니다.저도 같은 문제에 직면했지만, 대문자로 디렉토리 이름을 제공했을 때는 효과가 있었습니다.
DBA가 init.ora 파일을 수정하여 'utl_file_dir' 매개 변수에 액세스할 디렉터리를 추가해야 합니다.그러면 init.ora는 데이터베이스가 시작될 때만 읽기 때문에 데이터베이스 인스턴스를 중지하고 다시 시작해야 합니다.
다음 쿼리를 실행하여 이 매개 변수를 볼 수 있지만 변경할 수는 없습니다.
SELECT *
FROM V$PARAMETER
WHERE NAME = 'utl_file_dir'
공유하고 즐기세요.
utl_file.open(location, filename, mode)의 경우 경로가 아닌 위치에 대한 디렉토리 이름을 지정해야 합니다.예:DATA_FILE_DIR의 경우 디렉토리 이름이며 특정 디렉토리 이름에 대한 디렉토리 경로를 체크아웃합니다.
언급URL : https://stackoverflow.com/questions/2751113/utl-file-fopen-procedure-not-accepting-path-for-directory
'programing' 카테고리의 다른 글
요구 사항을 사용자 지정하는 방법.여러 환경을 위한 txt? (0) | 2023.06.21 |
---|---|
컴파일러에서 함수 이름 앞에 밑줄이 붙는 이유는 무엇입니까? (0) | 2023.06.21 |
Angular 2의 AoT 컴파일러용 롤업 사용 및 Moment.js 가져오기 (0) | 2023.06.21 |
Oracle 오류 PLS-00323: 하위 프로그램 또는 커서가 패키지 사양으로 선언되었으며 패키지 본문에 정의되어야 합니다. (0) | 2023.06.21 |
메인 클래스가 없는 Gradle 빌딩 Spring Boot 라이브러리 (0) | 2023.06.21 |