Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-15
제목 UTL_FILE PACKAGE를 사용한 FILE의 DATA HANDLING
UTL_FILE PACKAGE를 사용한 FILE의 DATA HANDLING
==============================================

Oracle 7.3 부터 PL/SQL을 이용해 일반 화일에 대한 input/output을 수행할 수
있는데, 이것은 UTL_FILE package를 사용함으로써 가능하다.

다음은 이 기능을 이용하기 위해 필요한 사항과 사용 예제이다.

1.환경 : oracle 7.3 이상, PL/SQL 2.3 이상

2.설정 :1) $ORACLE_HOME/dbs/init.ora에 다음 parameter를 지정함.
:
:
UTL_FILE_DIR=/oracle/utl_file
:
:
이것은 일반 화일 디렉토리로서 여러 개 지정할 수 있다.

2) db shutdown 후 restartup함.

3) 만약 이 package를 인식하지 못하는 경우에 한하여

필요한 package를 create하기 위해 두 개의 script를 돌린다.

% svrmgrl
Oracle Server Manager Release 2.3.2.0.0 - Production
Copyright (c) Oracle Corporation 1994, 1995. All rights
reserved.
Oracle7 Server Release 7.3.2.1.0 - Production Release
With the distributed, replication, parallel query and
Spatial Data options
PL/SQL Release 2.3.2.0.0 - Production

SVRMGR> connect internal
Connected.

SVRMGR> @utlfile
:
SVRMGR> @prvtfile.plb


3. UTL_FILE package의 내용
---------------------------------------------------------------------
Function/Procedure | Description
---------------------------------------------------------------------
FOPEN | Input이나 Output을 위해 file을 연다. file이
| 존재하지 않을 경우 file을 생성한다.
---------------------------------------------------------------------
IS_OPEN | file handler를 이용해 file이 open되었는지 여부를
| return한다.
---------------------------------------------------------------------
FCLOSE | file을 닫는다.
---------------------------------------------------------------------
FCLOSE_ALL | 열려 있는 모든 file을 닫는다.
---------------------------------------------------------------------
GET_LINE | open된 file로부터 한 line을 읽는다.
---------------------------------------------------------------------
PUT | open된 file에 한 line을 write한다.
| ( Line terminator를 붙이지 않는다.)
---------------------------------------------------------------------
PUT_LINE | open된 file에 한 line을 write한다.
| ( Line terminator를 붙인다.)
---------------------------------------------------------------------
PUTF | string을 formatting에 의해 write한다.
| (printf처럼)
---------------------------------------------------------------------
NEW_LINE | open된 file에 line terminator을 write한다.
---------------------------------------------------------------------
FFLUSH | open된 모든 file의 내용을 file에 physical하게
| write한다.
---------------------------------------------------------------------


4.사용 예 :

다음의 sample procedure를 만든다.
SQL> l
CREATE OR REPLACE PROCEDURE pms_utl IS

file_handle UTL_FILE.FILE_TYPE; -- file handle of OS flat file

cursor c1 is select empno, ename from emp;
v_empno emp.empno%type;
v_ename emp.ename%type;

linenum NUMBER := 0;
retrieved_buffer VARCHAR2(100); -- Line retrieved from flat file

BEGIN
-- Open file to write into and get it's file_handle
file_handle :=
UTL_FILE.FOPEN('/oracle/utl_file','myfile.txt','w');

-- Write a line of text out to the file.
UTL_FILE.PUT_LINE(file_handle, 'this is line 1 as a test');

open c1;
loop
fetch c1 into v_empno,v_ename;
exit when c1%notfound;

UTL_FILE.PUT_LINE(file_handle, to_char(v_empno)||' '||v_ename);

end loop;
close c1;

-- Close the file.
UTL_FILE.FCLOSE(file_handle);

-- Open the same file to read from
file_handle :=
UTL_FILE.FOPEN('/oracle/utl_file','myfile.txt','r');

loop

linenum := linenum + 1;

-- Read a line from the file.
UTL_FILE.GET_LINE (file_handle, retrieved_buffer);

-- Print fetched line out to the SQL*PLUS prompt.
DBMS_OUTPUT.PUT_LINE(retrieved_buffer);

end loop;
-- CLose the file.
UTL_FILE.FCLOSE(file_handle);

EXCEPTION

WHEN NO_DATA_FOUND THEN
--DBMS_OUTPUT.PUT_LINE('no_data_found');
UTL_FILE.FCLOSE(file_handle);
null;
WHEN UTL_FILE.INVALID_PATH THEN
DBMS_OUTPUT.PUT_LINE('UTL_FILE.INVALID_PATH');
UTL_FILE.FCLOSE(file_handle);
WHEN UTL_FILE.READ_ERROR THEN
DBMS_OUTPUT.PUT_LINE(' UTL_FILE.READ_ERROR');
UTL_FILE.FCLOSE(file_handle);
WHEN UTL_FILE.WRITE_ERROR THEN
DBMS_OUTPUT.PUT_LINE('UTL_FILE.WRITE_ERROR');
UTL_FILE.FCLOSE(file_handle);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('other stuff');
UTL_FILE.FCLOSE(file_handle);
END;
/


SQL> set serveroutput on;
SQL> exec pms_utl
this is line 1 as a test
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

PL/SQL procedure successfully completed.


4. 본 sample에서는 fopen의 예를 보았으나 일반적으로 c programming에서
사용되는 여러가지 함수와 유사한 기능이 제공되며 자세한 용법은
Oracle 7 Server Application Developer's Guide Page 8-32를 참조한다.
Comment
등록된 코멘트가 없습니다.