Oracle Data Record별 Text File 내보내는 방법

Oracle 2013. 1. 21. 17:47

Oracle DB에서 특정 Table의 Data를 Record별로 Text File을 생성하여 내보내고 싶을 때 어떻게 할까?

 

UTL_FILE 패키지를 이용하여 PL/SQL에서 파일의 입력 or 출력을 할 수 있다.

 

이는 PL/SQL에서 Log를 File별로 생성하고 싶을 때도 사용이 가능하다.

 

먼저, Oracle Directory를 생성해주어야 한다.

 

▣ Create Directory

 

    DBA 계정으로 oracle에 로그인을 한 후, Directory를 생성하고, 이를 사용하고자 하는 계정에 부여하면 된다.

 

   1. Create Directory exp_text as 'c:\temp';     --Temp Folder를 Directory로 설정하고, 이를 exp_text로 이름을 부여함

 

   2. grant read, write on directory exp_text to scott;    -- Scott 계정에 exp_text Directory에 대한 읽고, 쓰기 권한을 부여함.

 

 

 

위와 같이 Directory 생성 및 권한 부여가 되었다면, Scott 계정에서 아래와 같이 간단하게 PL/SQL을 이용하여 Text File로 Data를

 

추출할 수 있다.

 

▣ Export to Text File

 

create or replace
procedure Export2Text
IS
    vHandle    UTL_FILE.FILE_TYPE;
    vDirectory  varchar2(100);
    vFile   varchar2(256);
    vOutput    varchar2(32767);
 
    cursor c_cur is
    select empno, ename, hiredate, sal from emp;

begin
    vDirectory  := 'exp_text';
   
     for r_cur in c_cur
     loop  
          if r_cur.empno > 0 then  
               vFile := r_cur.empno || '.txt';
               vHandle := UTL_FILE.FOPEN(vDirectory ,vFile,'W', 32767);
               vOutput := r_cur.ename || ', ' || r_cur.hiredate || ', ' || r_cur.sal;
               UTL_FILE.PUT_LINE(vHandle, vOutput);
               UTL_FILE.FCLOSE(vHandle);     
          end if;
    end loop;

exception
    when others then
        UTL_FILE.FCLOSE_ALL;
        raise;
end;
/

 

 아래는 Directory내에 존재하는 file을 읽어오고자 할 때, 사용할 수 있는 PL/SQL이다.

 

▣ Import to Text File

 

create or replace
procedure Import2Text
is
     vHandle   UTL_FILE.FILE_TYPE;
     vDirectory  varchar2(100);
      vFile   varchar2(256);
     vInput    varchar2(32767);
begin
     vDirectory := 'exp_text';
     vFile := 'test.txt';                        
     vHandle   := UTL_FILE.FOPEN(vDirectory ,vFile,'R', 32767);
 
     begin
         loop
               UTL_FILE.GET_LINE(vHandle, vInput,32767);
               DBMS_OUTPUT.PUT_LINE(vInput);
         end loop;
     exception
        when NO_DATA_FOUND then
              dbms_output.put_line('last line of file');
     end;
 
     UTL_FILE.FCLOSE(vHandle);
exception
    when others then
        UTL_FILE.FCLOSE_ALL;
        raise;
end;
/

 

:     

TISTORY에 Login하려면 여기를 누르세요.