programing

UTL_FILE.FOPEN() 프로시저가 디렉터리 경로를 수락하지 않습니까?

skycolor 2023. 6. 21. 22:27
반응형

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 디렉토리에 액세스할 수 있지만 디렉터리 개체에 대한 읽기 및 쓰기 권한은 개별 사용자에게 개별적으로 부여될 수 있습니다.또한 디렉터리 개체를 사용하면 데이터베이스를 바운스하지 않고 디렉터리를 추가, 제거 또는 변경할 수 있습니다.

어느 경우든,oracleOS 사용자는 OS 디렉토리에 대한 읽기 및/또는 쓰기 권한이 있어야 합니다.명확하지 않은 경우, 이것은 데이터베이스 서버에서 디렉토리를 볼 수 있어야 한다는 을 의미합니다.따라서 로컬 PC의 디렉터리를 원격 데이터베이스 서버에서 실행 중인 프로세스에 노출하는 데 두 가지 방법을 모두 사용할 수 없습니다.파일을 데이터베이스 서버 또는 공유 네트워크 드라이브에 업로드해야 합니다.


만약에oracleOS 사용자에게 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

반응형