DBMS 1
DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!
UTL_FILE
Tibero System Package Guide
29.1. 개요
29.2. 프로시저
29.2.1. FCLOSE
29.2.2. FCLOSE_ALL
29.2.3. FCOPY
29.2.4. FFLUSH
29.2.5. FGETATTR
29.2.6. FREMOVE
29.2.7. FRENAME
29.2.8. FSEEK
29.2.9. GET_LINE
29.2.10. GET_RAW
29.2.11. NEW_LINE
29.2.12. PUT
29.2.13. PUTF
29.2.14. PUT_RAW
29.2.15. PUT_LINE
29.3. 함수
29.3.1. FGETPOS
29.3.2. FOPEN
29.3.3. IS_OPEN
UTL_FILE은 운영체제에서 관리하는 파일에 접근하기 위한 함수와 프로시저를 제공하는 패키지이다. 파일의 경로는 디렉터리명으로 지정할 수 있다.UTL_FILE 패키지에서 정의된 타입과 예외 상황은 다음과 같다.
본 절에서는 UTL_FILE 패키지에서 제공하는 프로시저를 알파벳 순으로 설명한다.
파일을 닫는 프로시저이다.
FCLOSE 프로시저의 세부 내용은 다음과 같다.
현재 세션에 열린 모든 파일을 닫는 프로시저이다.
FCLOSE_ALL 프로시저의 세부 내용은 다음과 같다.
- 프로토타입
PROCEDURE FCLOSE_ALL;
- 예외 상황
- 예제
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;
/
파일의 연속되는 부분을 새로 생성된 파일에 복사하는 프로시저이다.
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);
- 파라미터
- 예제
CREATE OR REPLACE DIRECTORY USER_PATH AS '/HOME/TIBERO/PATH';
BEGIN
UTL_FILE.FCOPY('USER_PATH', 'MYFILE.DAT', 'USER_PATH', 'MTFILE.BAK');
END;
/
아직 파일에 쓰지 않고 버퍼에 남아 있는 데이터를 파일에 쓰는 프로시저이다. 데이터는 반드시 EOL 문자로 끝나야 한다.
FFLUSH 프로시저의 세부 내용은 다음과 같다.
- 예외 상황
- 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;
/
디스크 파일의 속성을 반환하는 프로시저이다.
FGETATTR 프로시저의 세부 내용은 다음과 같다.
- 프로토타입
PROCEDURE FGETATTR (
location IN VARCHAR2,
filename IN VARCHAR2,
fexists OUT BOOLEAN,
file_length OUT NUMBER,
blocksize OUT BINARY_INTEGER);
- 파라미터
- 예제
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 예외 상황이 발생한다.
FREMOVE 프로시저의 세부 내용은 다음과 같다.
파일의 이름을 변경하는 프로시저이다. OS 셸에서 사용하는 mv 명령어와 동일하게 동작한다.
FRENAME 프로시저의 세부 내용은 다음과 같다.
- 프로토타입
PROCEDURE FRENAME (
location IN VARCHAR2,
filename IN VARCHAR2,
dest_dir IN VARCHAR2,
dest_file IN VARVCHAR2,
overwrite IN BOOLEAN DEFAULT FALSE);
- 파라미터
- 예제
CREATE OR REPLACE DIRECTORY USER_PATH AS '/home/user/path';
BEGIN
UTL_FILE.FRENAME('USER_PATH', 'MTFILE.BAK', 'USER_PATH', 'MYFILE.DAT');
END;
/
파일 포인터의 위치를 변경하는 프로시저이다.
FSEEK 프로시저의 세부내용은 다음과 같다.
- 예외 상황
- 예제
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 이상을 읽어 올 수 없다.
GET_LINE 프로시저의 세부 내용은 다음과 같다.
- 예외상황
- 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의 크기를 반환한다.
GET_RAW 프로시저의 세부indexterm">
- 프로토타입
PROCEDURE GET_RAW
(
fid IN UTL_FILE.FILE_TYPE,
r OUT NOCOPY RAW,
len IN PLS_INTEGER DEFAULT NULL
);
- 파라미터
- 예제
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 문자는 플랫폼에 따라 다르다.
NEW_LINE 프로시저의 세부 내용은 다음과 같다.
- 예외 상황
- INVALID_FILEHANDLE
- INVALID_OPERATION
- WRITE_ERROR
파일에 문자열을 넣을 때 사용하는 프로시저이다.
PUT 프로시저의 세부 내용은 다음과 같다.
- 예외 상황
- 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
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
);
- 파라미터
- 예외 상황
- 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 타입 데이터의 내용을 파일에 쓰는 프로시저이다.
PUT_RAW 프로시저의 세부 내용은 다음과 같다.
- 프로토타입
PROCEDURE PUT_RAW
(
fid IN UTL_FILE.FILE_TYPE,
r IN RAW,
autoflush IN BOOLEAN DEFAULT 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;
/
라인을 파일에 쓰는 프로시저이다. 이때 라인은 플랫폼에 종속적인 EOL 문자로 끝낸다.
PUT_LINE 프로시저의 세부 내용은 다음과 같다.
- 프로토타입
PROCEDURE PUT_LINE
(
file IN FILE_TYPE,
buffer IN VARCHAR2,
autoflush IN BOOLEAN DEFAULT 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;
/
본 절에서는 UTL_FILE 패키지에서 제공하는 함수를 알파벳 순으로 설명한다.
파일 내에서 파일 포인터의 상대적인 위치(byte)를 반환하는 함수이다.
FGETPOS 함수의 세부 내용은 다음과 같다.
- 프로토타입
FUNCTION FGETPOS
(
fid IN FILE_TYPE
)
return PLS_INTEGER;
- 파라미터
- 예제
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개의 파일을 동시에 열 수 있다.
FOPEN 함수의 세부 내용은 다음과 같다.
- 프로토타입
FUNCTION FOPEN(
location IN VARCHAR2,
filename IN VARCHAR2,
open_mode IN VARCHAR2,
max_linesize IN BINARY_INTEGER DEFAULT 1024)
return FILE_TYPE;
- 파라미터
- 예외 상황
- 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이며, 파일이 열려있는 경우 TRUE를 반환하고, 그렇지 않은 경우 FALSE를 반환한다.
IS_OPEN 함수의 세부 내용은 다음과 같다.
- 프로토타입
PROCEDURE IS_OPEN(file IN FILE_TYPE)
return BOOLEAN;
- 파라미터
- 예제
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;
/