내용 목차
본 장에서는 UTL_FILE 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명한다.
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 | 다음과 같이 유효하지 않은 오프셋이 주어진 경우이다.
|
DELETE_FAILED | DELETE 연산이 실패한 경우이다. |
RENAME_FAILED | RENAME 연산이 실패한 경우이다. |
본 절에서는 UTL_FILE 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.
파일을 닫는 프러시저이다.
프로토타입
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;
/
현재 세션에 열린 모든 파일을 닫는 프러시저이다.
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;
/
파일의 연속되는 부분을 새로 생성된 파일에 복사하는 프러시저이다.
프로토타입
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;
/
아직 파일에 쓰지 않고 버퍼에 남아 있는 데이터를 파일에 쓰는 프러시저이다. 데이터는 반드시 EOL 문자로 끝나야 한다.
프로토타입
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; /
디스크 파일의 속성을 반환하는 프러시저이다.
프로토타입
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; /
파일을 삭제하는 프러시저이다. 파일을 삭제하는 데 충분한 권한이 없는 경우 DELETE_FAILED 예외 상황이 발생한다.
프로토타입
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; /
파일의 이름을 변경하는 프러시저이다. OS 셸에서 사용하는 mv 명령어와 동일하게 동작한다.
프로토타입
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; /
파일 포인터의 위치를 변경하는 프러시저이다.
프로토타입
PROCEDURE FSEEK ( fid IN UTL_FILE.FILE_TYPE, absolute_offset IN PLS_INTEGER DEFAULT NULL, relative_offset IN PLS_INTEGER DEFAULT NULL );
파라미터
파라미터 | 설명 |
---|---|
fid | UTL_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; /
EOL 문자 또는 파일이 끝날 때까지의 내용을 읽어 오는 프러시저이다. FOPEN 함수에서 지정한 max_linesize 이상을 읽어 올 수 없다.
프로토타입
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; /
파일로부터 RAW 타입의 문자열을 읽어 오는 프러시저이다. EOL 문자를 무시하며, 읽은 Byte의 크기를 반환한다.
프로토타입
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; /
파일에 하나 이상의 EOL 문자를 넣는 프러시저이다. EOL 문자는 플랫폼에 따라 다르다.
프로토타입
PROCEDURE NEW_LINE ( file IN FILE_TYPE, lines IN NATURAL DEFAULT 1 );
파라미터
파라미터 | 설명 |
---|---|
file | 파일 핸들러이다. |
lines | 파일에 넣을 EOL 문자의 개수이다. |
INVALID_FILEHANDLE
INVALID_OPERATION
WRITE_ERROR
파일에 문자열을 넣을 때 사용하는 프러시저이다.
프로토타입
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; /
형식화된 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
프로토타입
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; /
RAW 타입 데이터의 내용을 파일에 쓰는 프러시저이다.
프로토타입
PROCEDURE PUT_RAW ( fid IN UTL_FILE.FILE_TYPE, r IN RAW, autoflush IN BOOLEAN DEFAULT FALSE );
파라미터
파라미터 | 설명 |
---|---|
fid | 파일 식별자이다. |
r | 파일에 쓸 데이터이다. |
autoflush | 쓰기를 한 후 출력 버퍼를 비울지 여부를 결정한다.
|
예제
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; /
라인을 파일에 쓰는 프러시저이다. 이때 라인은 플랫폼에 종속적인 EOL 문자로 끝낸다.
프로토타입
PROCEDURE PUT_LINE ( file IN FILE_TYPE, buffer IN VARCHAR2, autoflush IN BOOLEAN DEFAULT FALSE );
파라미터
파라미터 | 설명 |
---|---|
file | 파일 핸들러이다. |
buffer | 파일에 쓸 라인이다. |
autoflush | 쓰기를 한 후 출력 버퍼를 비울지 여부를 결정한다.
|
예제
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; /
본 절에서는 UTL_FILE 패키지에서 제공하는 함수를 알파벳 순으로 설명한다.
파일 내에서 파일 포인터의 상대적인 위치(Byte)를 반환하는 함수이다.
프로토타입
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; /
파일을 여는 함수이다. 최대 50개의 파일을 동시에 열 수 있다.
프로토타입
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 | 파일 모드이다. 파일 모드의 종류는 다음과 같다.
|
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; /
파일 핸들러를 통해 파일이 열려 있는지 검사하는 함수이다. 파일이 열려있는 경우 TRUE를 반환하고, 그렇지 않은 경우 FALSE를 반환한다.
프로토타입
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; /