UTL_FILE 패키지를 사용하여 PL/SQL에서 파일의 입출력을 실시할 수 있다.
PL/SQL에는 SQL*Plus의 SPOOL에 해당하는 간략화된 명령어가 없으므로 큰 로그를 출력하고 싶은 경우에는 UTL_FILE 패키지를 사용하든지 혹은 테이블을 사용한다.
표준 출력에는 DBMS_OUTPUT 패키지를 사용한다.
Oracle 8i이전이라면 초기화 파라미터 UTL_FILE_DIR를 설정해야 한다.
준비작업
■ 디렉토리 작성
디렉토리를 작성할 경우에 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;
EXCEPTIONWHEN 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 에 대응하게 되었다.
CREATE DIRECTORY recv_area AS '/u05/file_storage/recv_dir';
GRANT READ ON DIRECTORY recv_area TO user_name ;
■ 파일쓰기 (초기화 파라메터 사용시 )
■ 파일읽기 (초기화 파라메터 사용시 )
주의사항
|
