'UTL_FILE_DIR'에 해당되는 글 1건

  1. 2008.09.25 | [Oracle 10g] UTL_FILE 패키지..

[Oracle 10g] UTL_FILE 패키지..

오라클 | 2008. 9. 25. 19:41
Posted by 시반
 

◆ UTL_FILE Package

 

UTL_FILE 패키지를 사용하여 PL/SQL에서 파일의 입출력을 수행 할 수 있다.
PL/SQL에는 SQL*Plus의 SPOOL에 해당하는 간략화된 명령어가 없으므로 큰 로그를 출력하고 싶은 경우에는 UTL_FILE 패키지를 사용하든지 혹은 테이블을 사용한다.

 

표준 출력에는 DBMS_OUTPUT 패키지를 사용한다.

Oracle 8i이전이라면 초기화 파라미터 UTL_FILE_DIR를 설정해야 한다

 

프로그램의 Input과 output으로서, 서버OS 상의 텍스트파일을 사용하는 것으로,

PL/SQL프로그램 이외의 프로그램 정보를 뿌려주는것이 가능합니다.

 

UTL_FILE 패키지는 텍스트파일의 Open, Close, Read, Write의 기능을 제공합니다.

 

Oracle7.3부터 OS파일에 대한 쓰기,읽기를 지원하였으며

Oracle9iR2 부터 파일의 복사, 이동, 삭제 및 디렉토리 오브젝트의 이용도 가능해졌습니다.

 

주의사항 


안전을 보증하기 위해서, 파일에 접근하려면 초기화 파라메타 파일 UTL_FILE_DIR에

접근대상의 폴더(디렉토리)를 지정해 둘 필요가 있습니다. 

 

개행코드는 자동부가/삭제됩니다.

  - 한개의 행은 최대 1024바이트(개행코드 포함)가 될 수 있습니다.

  - Oracle8.0.5 부터 32767바이트(개행코드 포함) 까지 가능합니다.

    ◈FOPEN 프로시져로 크기를 지정 할 수 있습니다.

 

◆ UTL_FILE_DIR 편

 

.인스턴스를 시작한 OS 사용자가 지정한 디렉토리를 의미하며 파일에 대해서 OS레벨으로 I/O를 허가할 필요가 있다. 또한 모든 디렉토리를 대상으로 하기 위해 「UTL_FILE_DIR = *」으로 지정하는 경우 보안에 취약할 수 있으므로 되도록 특정위치를 지정하도록 한다.

 

 예) UTL_FILE_DIR = C:\TEMP

 

오라클 패키지중. dbms_logminer_d 라는 패키지를 이용하여 오라클 dictionary를 파일로 받으려는 경우  파일생성 위치를 패키지에서 utl_file_dir에 설정된 경로내에서만 지정할 수 있게 된다.

  복수의 디렉토리를 지정할 경우는, 사이에 다른 파라미터가 들어오지 않고 UTL_FILE_DIR 을 복수행 지정합니다.

 예)UTL_FILE_DIR = C:\TEMP

      UTL_FILE_DIR = C:\TEST

     

서로 다른  파라미터가 들어 있는 경우 맨 뒤에 지정한  경로만을 지정한 것으로 처리된다. 

 

준비작업


 

■ 디렉토리 작성

디렉토리를 작성할 경우에 OS 의 DBA 인 유저(통상은 oracle)로 디렉토리를 작성한다.

root 로 작성하는 경우에는, chown, chgrp, chmod 등에 의해 읽고 쓰기의 권한을 올바르게 설정한다.

파일의 I/O는 서버 프로세스에 의해서 행해지므로 그 프로세스의 오너(oracle)가 읽고 쓰기할 수 있어야 한다.

작성과 권한의 설정예 (root 에 의한 조작:권한만 있으면 root 일 필요는 없습니다)

# mkdir /u05/file_storage/recv_dir

# mkdir /u05/file_storage/send_dir

 

# chgrp dba /u05/file_storage/recv_dir

# chgrp dba /u05/file_storage/send_dir

 

# chown oracle /u05/file_storage/recv_dir

# chown oracle /u05/file_storage/send_dir

 

# chmod 700 /u05/file_storage/recv_dir

# chmod 700 /u05/file_storage/send_dir

 

디렉토리·오브젝트에 의한 파일 액세스


 

■ 디렉토리의 작성 CRAETE DIRECTORY

Oracle 9i 버젼부터 UTL_FILE 패키지가 CREATE DIRECTORY에 대응하게 되었다.
디렉토리의 추가에 따르는 재기동도 불필요.

  • 디렉토리 오브젝트의 작성
    DIRECTORY의 작성은 CREATE DIRECTORY 권한이 필요

         CREATE DIRECTORY recv_area AS '/u05/file_storage/recv_dir';
         CREATE DIRECTORY send_area AS '/u05/file_storage/send_dir';

  • 디렉토리에의 액세스권의 설정
    읽기 권한과 쓰기 권한은 개별적으로 처리한다.

        GRANT READ ON DIRECTORY recv_area TO user_name ;
        GRANT WRITE ON DIRECTORY send_area TO user_name ;
         --
         SELECT * FROM ALL_DIRECTORIES ;

 

■ 파일쓰기 (초기화 파라메터 사용시 )

CREATE OR REPLACE PROCEDURE RIVUS.CREATE_DIR_WRITE_SAMPLE

AS

  vHandle   UTL_FILE.FILE_TYPE;

  vDirname  VARCHAR2(250);

  vFilename VARCHAR2(250);

  vOutput   VARCHAR2(32767);

BEGIN

  vDirname  := 'SEND_AREA'; -- (주)디렉토리 오브젝트명을 대문자로 지정한다

  vFilename := 'test.txt';

  vHandle   := UTL_FILE.FOPEN(vDirname ,vFilename,'w', 32767);

  vOutput   := 'CREATE DIRECTORY 경유로의 파일출력';

  UTL_FILE.PUT_LINE(vHandle, vOutput);

  UTL_FILE.FCLOSE(vHandle);

EXCEPTION WHEN OTHERS THEN

  UTL_FILE.FCLOSE_ALL;

  RAISE;

END;

/

■ 파일읽기 (초기화 파라메터 사용시 )

CREATE OR REPLACE PROCEDURE RIVUS.CREATE_DIR_READ_SAMPLE

AS

  vHandle   UTL_FILE.FILE_TYPE;

  vDirname  VARCHAR2(250);

  vFilename VARCHAR2(250);

  vInput    VARCHAR2(32767);

BEGIN

  vDirname  := 'RECV_AREA';

  vFilename := 'test.txt';

  vHandle   := UTL_FILE.FOPEN(vDirname ,vFilename,'r', 32767);

 

  BEGIN

    LOOP

      UTL_FILE.GET_LINE(vHandle, vInput,32767);

      DBMS_OUTPUT.PUT_LINE(vInput);

    END LOOP;

  EXCEPTION WHEN NO_DATA_FOUND THEN

    DBMS_OUTPUT.PUT_LINE('파일의 마지막');

  END;

 

  UTL_FILE.FCLOSE(vHandle);

EXCEPTION WHEN OTHERS THEN

  UTL_FILE.FCLOSE_ALL; RAISE;

END;

/

주의사항 


  • UTL_FILE 패키지를 사용해 한 번에 입출력할 수 있는 길이는 32767(32K) 바이트 (※) 

  • OPEN 한 파일은 반드시 CLOSE 하도록 예외 처리를 해둔다.UTL_FILE.FCLOSE_ALL 를 사용하면 편리

  • RAW형을 출력할 수 있지만 줄 끝에는 OS 고유의 개행 코드가 반드시 부여된다.


    Oracle 10g 에서는 wb 에 의한 (RAW 모드) FOPEN 가 서포트되고 있으므로, 그 쪽을 사용하면 문제 없다.

이 제한에 있어서 Oracle 10g 이후가 아니면 순수한 바이너리필드를 사용할수 없다.

(※) 한 번의 기입으로 32KB 를 넘을 수 없지만, RAW 모드로의 기입에 대해서는 여러 차례에 기입을 분할하는 것으로 1행이 32KB 를 초과하는 것이 가능하다

 

◆DIRECTORY 편

UTL_FILE 패키지를 사용해 PL/SQL에서 파일의 입출력을 실시할 수 있다.Oracle 9i 이후부터는 CREATE DIRECTORY 를 사용하여 유저 단위, 읽어들이기, 쓰기의 제한이 가능하게 되었다. 또한  디렉토리를 추가하고 싶은 경우에도 Oracle 의 재기동이 필요하지 않으므로 다운 타임을 줄일 수 있다

 

준비작업


■ 디렉토리 작성

디렉토리 파일의 작성 (UTL_FILE_DIR 편과 같다)

디렉토리를 작성할 경우에 OS 의 DBA 인 유저(통상은 oracle)로 디렉토리를 작성한다.

내용은 생략 ⇒ UTL_FILE 의 사용법 (UTL_FILE_DIR 편)의 준비작업을 참조

 

디렉토리·오브젝트에 의한 파일 액세스


■ 디렉토리의 작성 CRAETE DIRECTORY

Oracle 9i 버젼부터 UTL_FILE 패키지가 CREATE DIRECTORY 에 대응하게 되었다.
디렉토리의 추가에 따르는 재기동도 불필요.

  • 디렉토리 오브젝트의 작성
    DIRECTORY의 작성은 CREATE DIRECTORY 권한이 필요

         CREATE DIRECTORY recv_area AS '/u05/file_storage/recv_dir';
         CREATE DIRECTORY send_area AS '/u05/file_storage/send_dir';

  • 디렉토리에의 액세스권의 설정
    읽기 권한과 쓰기 권한은 개별적으로 처리한다.

        GRANT READ ON DIRECTORY recv_area TO user_name ;
        GRANT WRITE ON DIRECTORY send_area TO user_name ;
         --
         SELECT * FROM ALL_DIRECTORIES ;

 

■ 파일쓰기 (초기화 파라메터 사용시 )

CREATE OR REPLACE PROCEDURE RIVUS.CREATE_DIR_WRITE_SAMPLE

AS

  vHandle   UTL_FILE.FILE_TYPE;

  vDirname  VARCHAR2(250);

  vFilename VARCHAR2(250);

  vOutput   VARCHAR2(32767);

BEGIN

  vDirname  := 'SEND_AREA'; -- (주)디렉토리 오브젝트명을 대문자로 지정한다

  vFilename := 'test.txt';

  vHandle   := UTL_FILE.FOPEN(vDirname ,vFilename,'w', 32767);

  vOutput   := 'CREATE DIRECTORY 경유로의 파일출력';

  UTL_FILE.PUT_LINE(vHandle, vOutput);

  UTL_FILE.FCLOSE(vHandle);

EXCEPTION WHEN OTHERS THEN

  UTL_FILE.FCLOSE_ALL;

  RAISE;

END;

/

■ 파일읽기 (초기화 파라메터 사용시 )

CREATE OR REPLACE PROCEDURE RIVUS.CREATE_DIR_READ_SAMPLE

AS

  vHandle   UTL_FILE.FILE_TYPE;

  vDirname  VARCHAR2(250);

  vFilename VARCHAR2(250);

  vInput    VARCHAR2(32767);

BEGIN

  vDirname  := 'RECV_AREA';

  vFilename := 'test.txt';

  vHandle   := UTL_FILE.FOPEN(vDirname ,vFilename,'r', 32767);

 

  BEGIN

    LOOP

      UTL_FILE.GET_LINE(vHandle, vInput,32767);

      DBMS_OUTPUT.PUT_LINE(vInput);

    END LOOP;

  EXCEPTION WHEN NO_DATA_FOUND THEN

    DBMS_OUTPUT.PUT_LINE('파일의 마지막');

  END;

 

  UTL_FILE.FCLOSE(vHandle);

EXCEPTION WHEN OTHERS THEN

  UTL_FILE.FCLOSE_ALL; RAISE;

END;

/

주의사항 


  • UTL_FILE에서 한번에 입출력할 수 있는 길이는 32767(32K) 바이트 (※) 

  • OPEN 한 파일은 반드시 CLOSE 하도록 예외 처리를 해둔다.UTL_FILE.FCLOSE_ALL 를 사용하면 편리

  • RAW형을 출력할 수 있지만 줄 끝에는 OS 고유의 개행 코드가 반드시 부여된다.


    Oracle 10g 에서는 wb 에 의한 (RAW 모드) FOPEN 가 서포트되고 있으므로, 그 쪽을 사용하면 문제 없다.

이 제한에 있어서 Oracle 10g 이후가 아니면 순수한 바이너리필드를 사용할수 없다.

(※) 한 번의 기입으로 32KB 를 넘을 수 없지만, RAW 모드로의 기입에 대해서는 여러 차례에 기입을 분할하는 것으로 1행이 32KB 를 초과하는 것이 가능하다

 
 

 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)