제39장 UTL_FILE

내용 목차

39.1. 개요
39.2. 프러시저
39.2.1. FCLOSE
39.2.2. FCLOSE_ALL
39.2.3. FCOPY
39.2.4. FFLUSH
39.2.5. FGETATTR
39.2.6. FREMOVE
39.2.7. FRENAME
39.2.8. FSEEK
39.2.9. GET_LINE
39.2.10. GET_RAW
39.2.11. NEW_LINE
39.2.12. PUT
39.2.13. PUTF
39.2.14. PUT_RAW
39.2.15. PUT_LINE
39.3. 함수
39.3.1. FGETPOS
39.3.2. FOPEN
39.3.3. IS_OPEN

본 장에서는 UTL_FILE 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.

39.1. 개요

UTL_FILE은 운영체제에서 관리하는 파일에 접근하기 위한 함수와 프러시저를 제공하는 패키지이다. 파일의 경로는 디렉터리명으로 지정할 수 있다.

UTL_FILE 패키지에서 정의된 타입과 예외 상황은 다음과 같다.

  • 타입

    FILE_TYPE의 타입은 파일 식별자로 사용된다.

    TYPE FILE_TYPE IS RECORD
    (
        id       BINARY_INTEGER, 
        datatype BINARY_INTEGER
    );
  • 예외 상황

    예외 상황설명
    INVALID_PATH파일의 경로가 유효하지 않은 경우이다.
    INVALID_MODE유효하지 않은 모드를 사용한 경우이다.
    INVALID_FILEHANDLE유효하지 않은 파일 핸들에 파일 연산을 하는 경우이다.
    INVALID_OPERATION파일에 대한 연산을 수행할 수 없는 경우이다.
    READ_ERROR읽기 연산 중에 에러가 발생하는 경우이다.
    WRITE_ERROR쓰기 연산 중에 에러가 발생하는 경우이다.
    INTERNAL_ERROR예기치 못한 에러가 발생하는 경우이다.
    FILE_OPEN파일이 열려 있어서 해당 연산을 수행할 수 없는 경우이다.
    INVALID_MAXLINESIZE

    FOPEN 함수를 사용할 때 max_linesize 값이 유효하지 않은 경우이다.

    max_linesize 값은 1과 32767bytes 사이의 값이어야 한다.

    INVALID_FILENAME파일 이름이 유효하지 않은 경우이다.
    ACCESS_DENIED해당 파일에 대한 접근 권한이 없는 경우이다.
    INVALID_OFFSET

    다음과 같이 유효하지 않은 오프셋이 주어진 경우이다.

    • 상대 오프셋과 절대 오프셋이 모두 NULL일 때 유효하지 않다.

    • 절대 오프셋이 음수일 때 유효하지 않다.

    • 오프셋이 파일 끝의 위치를 초과했을 때 유효하지 않다.

    DELETE_FAILEDDELETE 연산이 실패한 경우이다.
    RENAME_FAILEDRENAME 연산이 실패한 경우이다.

39.2. 프러시저

본 절에서는 UTL_FILE 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.

39.2.1. FCLOSE

파일을 닫는 프러시저이다.

FCLOSE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FCLOSE
    (
        file IN OUT FILE_TYPE
    );
  • 파라미터

    파라미터설명
    file파일 핸들이다.
  • 예외 상황

    • WRITE_ERROR

    • INVALID_FILEHANDLE

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/HOME/TIBERO/PATH';
    
    DECLARE
      fname   VARCHAR2(1024);
    BEGIN
        file := UTL_FILE.FOPEN('USER_PATH', 'MYFILE.DAT', 'r');
        UTL_FILE.FCLOSE(file);
    END;
    /

39.2.2. FCLOSE_ALL

현재 세션에 열린 모든 파일을 닫는 프러시저이다.

FCLOSE_ALL 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FCLOSE_ALL;
  • 예외 상황

    • WRITE_ERROR

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/HOME/TIBERO/PATH';
    
    DECLARE
        outfile   UTL_FILE.FILE_TYPE;
        appfile   UTL_FILE.FILE_TYPE;
        path       VARCHAR(10);
    BEGIN
        path := 'USER_PATH';
    
        outfile := UTL_FILE.FOPEN(path, 'output_file.txt', 'w');
        appfile := UTL_FILE.FOPEN(path, 'append_file.txt', 'w');
    
        UTL_FILE.FCLOSE_ALL;
    END;
    /

39.2.3. FCOPY

파일의 연속되는 부분을 새로 생성된 파일에 복사하는 프러시저이다.

FCOPY 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FCOPY
    ( 
        location   IN VARCHAR2,
        filename   IN VARCHAR2, 
        dest_dir   IN VARCHAR2,
        dest_file  IN VARCHAR2,
        start_line IN BINARY_INTEGER DEFAULT 1, 
        end_line   IN BINARY_INTEGER DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    location복사를 진행할 대상 파일이 위치할 경로의 디렉터리명이다.
    filename복사를 진행할 대상 파일의 이름이다.
    dest_dir복사가 진행된 이후 파일이 위치할 경로의 디렉터리명이다.
    dest_file복사가 진행된 이후의 파일의 이름이다.
    start_line

    복사를 진행할 시작 위치이다. 파일의 라인 번호를 사용해 명시한다.

    기본값은 1이며, 파일의 첫 번째를 의미한다.

    end_line

    복사를 끝낼 종료 위치이다. start_line과 마찬가지로 라인 번호로 명시한다.

    기본값은 NULL이며, 파일의 마지막 라인을 의미한다.

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/HOME/TIBERO/PATH';
             
    BEGIN
        UTL_FILE.FCOPY('USER_PATH', 'MYFILE.DAT', 'USER_PATH', 'MTFILE.BAK');
    END;
    /

39.2.4. FFLUSH

아직 파일에 쓰지 않고 버퍼에 남아 있는 데이터를 파일에 쓰는 프러시저이다. 데이터는 반드시 EOL 문자로 끝나야 한다.

FFLUSH 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FFLUSH
    (
        file IN FILE_TYPE
    );
  • 파라미터

    파라미터설명
    file파일 핸들러이다.
  • 예외 상황

    • INVALID_FILEHANDLE

    • INVALID_OPERATION

    • WRITE_ERROR

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    DECLARE
      fhandle  UTL_FILE.FILE_TYPE;
      buffer   VARCHAR2(32767);
      path     VARCHAR2(1024);
      fname    VARCHAR2(1024);
    BEGIN
      path     := 'USER_PATH';
      fname    :=  'MYFILE.TXT';
      fhandle  := UTL_FILE.FOPEN(path, fname, 'w');
      buffer   := 'This is the message for output file';
      for i in 1..10 loop
        UTL_FILE.PUT(fhandle, buffer);
      end loop;
      UTL_FILE.NEW_LINE(fhandle);
      UTL_FILE.FFLUSH(fhandle);
      UTL_FILE.FCLOSE(fhandle);
    END;
    /

39.2.5. FGETATTR

디스크 파일의 속성을 반환하는 프러시저이다.

FGETATTR 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FGETATTR 
    (
        location IN VARCHAR2,
        filename IN VARCHAR2,
        fexists  OUT BOOLEAN,
        file_length OUT NUMBER,
        blocksize OUT BINARY_INTEGER
    );
  • 파라미터

    파라미터설명
    location파일의 경로를 나타내는 디렉터리명이다.
    filename파일의 이름이다.
    fexists파일의 존재 여부이다.
    file_length파일의 길이(Byte)이다.
    blocksize파일 시스템의 블록 크기(Byte)이다.
  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
      info_exists  BOOLEAN;
      info_flen    NUMBER;
      info_bsz     BINARY_INTEGER;
      etc_path     VARCHAR2(1024);
      fname        VARCHAR2(1024);
    BEGIN
      etc_path := 'USER_PATH';
      fname    := 'hostname';
      UTL_FILE.FGETATTR(etc_path, fname, info_exists, info_flen, info_bsz);
    
      if info_exists = TRUE then
        DBMS_OUTPUT.PUT_LINE('file name         :' || fname);
        DBMS_OUTPUT.PUT_LINE('file size (bytes) :' || TO_CHAR(info_flen));
        DBMS_OUTPUT.PUT_LINE('block size(bytes) :' || TO_CHAR(info_bsz));
      end if;
    END;
    /

39.2.6. FREMOVE

파일을 삭제하는 프러시저이다. 파일을 삭제하는 데 충분한 권한이 없는 경우 DELETE_FAILED 예외 상황이 발생한다.

FREMOVE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FREMOVE
    (
        location IN VARCHAR2,
        filename IN VARCHAR2
    );
  • 파라미터

    파라미터설명
    location파일의 위치를 나타내는 디렉터리명이다.
    filename파일의 이름이다.
  • 예외 상황

    • DELETE_FAILED

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    BEGIN
        UTL_FILE.FREMOVE('USER_PATH', 'MYFILE.BAK');
    END;
    /

39.2.7. FRENAME

파일의 이름을 변경하는 프러시저이다. OS 셸에서 사용하는 mv 명령어와 동일하게 동작한다.

FRENAME 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FRENAME 
    (
        location   IN VARCHAR2,
        filename   IN VARCHAR2, 
        dest_dir   IN VARCHAR2, 
        dest_file  IN VARVCHAR2,
        overwrite  IN BOOLEAN DEFAULT FALSE
    );
  • 파라미터

    파라미터설명
    location원본 파일의 경로를 나타내는 디렉터리명이다.
    filename원본 파일의 이름이다.
    dest_dir변경된 파일의 경로를 나타내는 디렉터리명이다.
    dest_file변경된 파일의 이름이다.
    overwrite변경된 파일의 이름이 이미 존재할 경우 덮어쓸지를 지정한다.
  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    BEGIN
        UTL_FILE.FRENAME('USER_PATH', 'MTFILE.BAK', 'USER_PATH', 'MYFILE.DAT');
    END;
    /

39.2.8. FSEEK

파일 포인터의 위치를 변경하는 프러시저이다.

FSEEK 프러시저의 세부내용은 다음과 같다.

  • 프로토타입

    PROCEDURE FSEEK 
    (
        fid IN UTL_FILE.FILE_TYPE,
        absolute_offset IN PLS_INTEGER DEFAULT NULL,
        relative_offset IN PLS_INTEGER DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    fidUTL_FILE 패키지의 FILE_TYPE 타입의 파일 식별자이다.
    absolute_offset절대 오프셋, 파일의 시작부터의 오프셋 값이다. (기본값: NULL)
    relative_offset상대 오프셋, 현재 파일 포인터 위치에서 양수이면 뒤쪽, 음수이면 앞쪽 방향을 나타낸다. 절대 오프셋이 있는 경우 상대 오프셋은 무시 된다. (기본값: NULL)
  • 예외 상황

    • INVALID_OFFSET

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
      infile          UTL_FILE.FILE_TYPE;
      absolute_offset PLS_INTEGER:= 10;
      scan_first      RAW(32767);
      scan_second     RAW(32767);
      len CONSTANT    PLS_INTEGER := 32767;
    BEGIN
      infile := UTL_FILE.FOPEN('USER_PATH','codd.bcnf', 'r');
    
      UTL_FILE.FSEEK(infile, absolute_offset, -5);
      UTL_FILE.GET_RAW(infile, scan_first, 1);
      UTL_FILE.FSEEK(infile, 5);
      UTL_FILE.GET_RAW(infile, scan_second, 1);
    
      if  scan_first != scan_second then
        DBMS_OUTPUT.PUT_LINE('ralative_offset ignored!');
      end if;
    
      UTL_FILE.FCLOSE(infile);
    END;
    /

39.2.9. GET_LINE

EOL 문자 또는 파일이 끝날 때까지의 내용을 읽어 오는 프러시저이다. FOPEN 함수에서 지정한 max_linesize 이상을 읽어 올 수 없다.

GET_LINE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE GET_LINE 
    (
        file   IN  FILE_TYPE,
        buffer OUT VARCHAR2,
        len    IN  PLS_INTEGER DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    file파일 핸들러이다.
    buffer읽어 온 데이터이다.
    len

    파일로부터 읽어 올 Byte의 크기이다.

    (기본값: NULL, NULL인 경우 max_linesize 값을 갖는다.)

  • 예외상황

    • INVALID_FILEHANDLE

    • INVALID_OPERATION

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE 
        infile       UTL_FILE.FILE_TYPE;
        length       CONSTANT PLS_INTEGER := 1024;
        read_buffer  VARCHAR2(1024) := NULL;
    BEGIN
        infile := UTL_FILE.FOPEN('USER_PATH','hosts', 'r');
        loop
            UTL_FILE.GET_LINE(infile, read_buffer, length);
            DBMS_OUTPUT.PUT_LINE(read_buffer);
            if read_buffer is NULL then
                 DBMS_OUTPUT.PUT_LINE(read_buffer);
            else
                exit;
            end if;
        end loop;
    
        UTL_FILE.FCLOSE(infile);
    END;
    /

39.2.10. GET_RAW

파일로부터 RAW 타입의 문자열을 읽어 오는 프러시저이다. EOL 문자를 무시하며, 읽은 Byte의 크기를 반환한다.

GET_RAW 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE GET_RAW
    (
        fid  IN  UTL_FILE.FILE_TYPE,
        r    OUT NOCOPY RAW,
        len  IN  PLS_INTEGER DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    fid파일 식별자이다.
    buffer읽은 데이터이다.
    len

    파일로부터 읽어 올 Byte의 크기이다.

    (기본값: NULL, NULL인 경우 max_linesize 값을 갖는다.)

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE 
      infile       UTL_FILE.FILE_TYPE;
      length       CONSTANT PLS_INTEGER := 32;
      read_buffer  RAW(32767);
    BEGIN
      infile := UTL_FILE.FOPEN('USER_PATH','hosts', 'r');
      UTL_FILE.GET_RAW(infile, read_buffer, length);
      UTL_FILE.FCLOSE(infile);
    END;
    /

39.2.11. NEW_LINE

파일에 하나 이상의 EOL 문자를 넣는 프러시저이다. EOL 문자는 플랫폼에 따라 다르다.

NEW_LINE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE NEW_LINE
    (
        file  IN FILE_TYPE,
        lines IN NATURAL DEFAULT 1 
    );
  • 파라미터

    파라미터설명
    file파일 핸들러이다.
    lines파일에 넣을 EOL 문자의 개수이다.
  • 예외 상황

    • INVALID_FILEHANDLE

    • INVALID_OPERATION

    • WRITE_ERROR

39.2.12. PUT

파일에 문자열을 넣을 때 사용하는 프러시저이다.

PUT 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE PUT
    (
        file IN FILE_TYPE,
        buffer IN VARCHAR2
    );
  • 파라미터

    파라미터설명
    file파일 핸들러이다.
    buffer

    파일에 쓸 내용이다.

    파일이 w(쓰기 텍스트)나 a(추가 텍스트) 모드로 열리지 않은 경우 INVALID_OPERATION 예외 상황이 발생한다.

  • 예외 상황

    • INVALID_FILEHANDLE

    • INVALID_OPERATION

    • WRITE_ERROR

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    DECLARE
      outfile  UTL_FILE.FILE_TYPE;
      buf      VARCHAR(1024) := NULL;
    BEGIN
      outfile := UTL_FILE.FOPEN('USER_PATH', 'MYFILE.DAT', 'w');
    
      for i in 1..10 loop
        buf := buf || '0123456789';
      end loop;
    
      UTL_FILE.PUT( outfile, buf );
      UTL_FILE.FCLOSE(outfile);
    END;
    /

39.2.13. PUTF

형식화된 PUT 프러시저이다. PUTF의 형식화된 문자열은 C언어에서 표준 입출력(standard I/O)의 fprintf에서의 형식화된 문자열과 동일하게 %s와 이스케이프 문자를 포함한다. 이스케이프 문자로 \n을 사용할 수 있으며 %s는 그 뒤에 나오는 인수 문자열을 대체한다.

예를 들어 다음과 같은 세 개의 인수가 있다고 가정하면,

arg1 = 'string1'; 
arg2 = 'string2'; 
arg3 = 'string3'; 

위의 세 개의 인수를 사용하는 형식화된 문자열은 다음과 같다.

utl_file.putf( ofile, 'This is example of formatted string : %s %s %s \n',
               arg1, arg2, arg3);

또한 위의 내용이 실행되면 다음과 같은 내용이 출력된다.

This is example of formated string : string1 string2 string3

PUTF 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCUDURE PUTF 
    (
        file   IN FILE_TYPE,
        format IN VARCHAR2,
        arg1   IN VARCHAR2 DEFAULT NULL,
        arg2   IN VARCHAR2 DEFAULT NULL,
        arg3   IN VARCHAR2 DEFAULT NULL,
        arg4   IN VARCHAR2 DEFAULT NULL,
        arg5   IN VARCHAR2 DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    file파일 핸들러이다.
    format%s와 이스케이프 문자(\n)를 포함하는 형식화된 문자열이다.
    arg1-5%s에 대체되는 선택할 수 있는 문자열이다. (기본값: NULL)
  • 예외 상황

    • INVALID_FILEHANDLE

    • INVALID_OPERATION

    • WRITE_ERROR

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
        fname    VARCHAR2(2048);
        path     VARCHAR2(2048);
        outfile  UTL_FILE.FILE_TYPE;
    BEGIN
        fname := 'MYFILE.DAT';
        path  := 'USER_PATH';
        outfile := UTL_FILE.FOPEN(path, fnamet /home/posung/path/MYFILE.DAT!cat 
                   /home/posung/path/MYFILE.DAT, 'w');
        UTL_FILE.PUTF( outfile, '%s %s formated file output example\n', path, fname);
        UTL_FILE.FCLOSE(outfile);
    END;
    /

39.2.14. PUT_RAW

RAW 타입 데이터의 내용을 파일에 쓰는 프러시저이다.

PUT_RAW 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE PUT_RAW
    (
        fid       IN UTL_FILE.FILE_TYPE, 
        r         IN RAW, 
        autoflush IN BOOLEAN DEFAULT FALSE 
    );
  • 파라미터

    파라미터설명
    fid파일 식별자이다.
    r파일에 쓸 데이터이다.
    autoflush

    쓰기를 한 후 출력 버퍼를 비울지 여부를 결정한다.

    • TRUE: 버퍼를 비운다.

    • FALSE: 기본값으로 버퍼를 비우지 않는다.

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
        outfile  UTL_FILE.FILE_TYPE;
        buf RAW(8) := HEXTORAW('6161616100616100');
    BEGIN
        outfile := UTL_FILE.FOPEN('USER_PATH', 'MYFILE.DAT', 'wb');
    
        UTL_FILE.PUT_RAW(outfile, buf);
    
        UTL_FILE.FCLOSE(outfile);
    END;
    /

39.2.15. PUT_LINE

라인을 파일에 쓰는 프러시저이다. 이때 라인은 플랫폼에 종속적인 EOL 문자로 끝낸다.

PUT_LINE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE PUT_LINE
    (
        file      IN FILE_TYPE,
        buffer    IN VARCHAR2,
        autoflush IN BOOLEAN DEFAULT FALSE
    );
  • 파라미터

    파라미터설명
    file파일 핸들러이다.
    buffer파일에 쓸 라인이다.
    autoflush

    쓰기를 한 후 출력 버퍼를 비울지 여부를 결정한다.

    • TRUE: 버퍼를 비운다.

    • FALSE: 기본값으로 버퍼를 비우지 않는다.

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
        outfile  UTL_FILE.FILE_TYPE;
        out_buf  VARCHAR2(1024);
    BEGIN
        outfile := UTL_FILE.FOPEN('USER_PATH', 'MYFILE.DAT', 'w');
    
        for i in 1..10 loop
            UTL_FILE.PUT_LINE(outfile,  i || ' put_line is complete', TRUE);
        end loop;
    
        UTL_FILE.FCLOSE(outfile);
    END;
    /

39.3. 함수

본 절에서는 UTL_FILE 패키지에서 제공하는 함수를 알파벳 순으로 설명한다.

39.3.1. FGETPOS

파일 내에서 파일 포인터의 상대적인 위치(Byte)를 반환하는 함수이다.

FGETPOS 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    FUNCTION FGETPOS
    (
        fid  IN FILE_TYPE
    )
    return PLS_INTEGER;
  • 파라미터

    파라미터설명
    fid파일 핸들러이다.
  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
      file   UTL_FILE.FILE_TYPE;
      fpos   PLS_INTEGER := 0;
      path   VARCHAR2(1024);
      fname  VARCHAR2(1024);
    BEGIN
        file := UTL_FILE.FOPEN('USER_PATH', 'MYFILE.DAT', 'r');
        UTL_FILE.FSEEK(file, 10, 1);
        fpos := UTL_FILE.FGETPOS(file);
        DBMS_OUTPUT.PUT_LINE('Offest is ' || TO_CHAR(fpos, 'S9999999999'));
    
        UTL_FILE.FCLOSE(file);
    END;
    /

39.3.2. FOPEN

파일을 여는 함수이다. 최대 50개의 파일을 동시에 열 수 있다.

FOPEN 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    FUNCTION FOPEN
    (
        location     IN VARCHAR2,
        filename     IN VARCHAR2,
        open_mode    IN VARCHAR2, 
        max_linesize IN BINARY_INTEGER DEFAULT 1024
    ) 
    RETURN FILE_TYPE;
  • 파라미터

    파라미터설명
    location파일의 경로를 나타내는 디렉터리명이다.
    filename파일의 이름이다.
    open_mode

    파일 모드이다.

    파일 모드의 종류는 다음과 같다.

    • r: 읽기 텍스트 모드이다.

    • w: 쓰기 텍스트 모드이다.

    • a: 추가 텍스트 모드이다.

    • rb: 읽기 바이트 모드이다.

    • wb: 쓰기 바이트 모드이다.

    • ab: 추가 바이트 모드로, 추가 모드에서 파일이 존재하지 않으면 쓰기 모드로 파일을 생성한다.

    max_linesize

    각 라인에 포함되는 Byte의 최댓값으로 newline 문자를 포함한다.

    최소 1byte에서 최대 32767bytes이다. (기본값: 1024bytes)

  • 예외 상황

    • INVALID_PATH

    • INVALID_MODE

    • INVALID_OPERATION

    • INVALID_MAXLINESIZE

  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
        infile    UTL_FILE.FILE_TYPE;
        outfile   UTL_FILE.FILE_TYPE;
        appfile   UTL_FILE.FILE_TYPE;
        max_lsz   CONSTANT BINARY_INTEGER := 4096;
        buffer    VARCHAR2(1024);
        data1     VARCHAR2(1024);
        data2     VARCHAR2(1024);
        path      VARCHAR2(1024);
    BEGIN
        path := 'USER_PATH';
    
        outfile := UTL_FILE.FOPEN(path, 'output_file.txt', 'w',  max_lsz);
        appfile := UTL_FILE.FOPEN(path, 'append_file.txt', 'w',  max_lsz);
    
        data1 := '0123456789';
        data2 := 'abcdefghij';
        for  i in 1..10 loop
            UTL_FILE.PUT_LINE(outfile, data1);
            UTL_FILE.PUT_LINE(outfile, data2);
        end loop;
    
        UTL_FILE.FCLOSE(outfile);
        UTL_FILE.FCLOSE(appfile);
    
        infile := UTL_FILE.FOPEN(path, 'output_file.txt', 'r',  max_lsz);
        UTL_FILE.GET_LINE(infile, buffer);
        DBMS_OUTPUT.PUT_LINE(buffer);
        UTL_FILE.FCLOSE(infile);
        appfile := UTL_FILE.FOPEN( path, 'append_file.txt', 'a',  max_lsz );
        UTL_FILE.PUT_LINE(appfile, 'appended');
        UTL_FILE.FCLOSE(appfile);
    END;
    /

39.3.3. IS_OPEN

파일 핸들러를 통해 파일이 열려 있는지 검사하는 함수이다. 파일이 열려있는 경우 TRUE를 반환하고, 그렇지 않은 경우 FALSE를 반환한다.

IS_OPEN 함수의 세부 내용은 다음과 같다.

  • 프로토타입

    PROCEDURE IS_OPEN
    (
        file IN  FILE_TYPE
    ) 
    RETURN BOOLEAN;
  • 파라미터

    파라미터설명
    file파일 핸들러이다.
  • 예제

    CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
    
    DECLARE
        openfile    UTL_FILE.FILE_TYPE;
        open_flag   BOOLEAN;
        status      VARCHAR(10);
        fname       VARCHAR(10);
    BEGIN
        fname := 'MYFILE.DAT';
        openfile := UTL_FILE.FOPEN('USER_PATH', fname, 'r');
        if UTL_FILE.IS_OPEN(openfile) then
            status := 'opened';
        else
            status := 'not opened';
        end if;
    
        DBMS_OUTPUT.PUT_LINE(fname || ' file status : ' || status);
        UTL_FILE.FCLOSE(openfile);
        dbms_output.put_line(fname || 'is closed');
        if utl_file.IS_OPEN(openfile) then
            status := 'opened';
        else
            status := 'not opened';
        end if;
        DBMS_OUTPUT.PUT_LINE(fname || ' file status : ' || status);
    END;
    /