2017-04-20 7 views
-1

나는 PostgreSQL에 새로운 소식이있어서 에 나를 가리켜 줄 사람이 있어야 함수의 결과를 텍스트 파일에 쓰는 방법을 알 수 있습니다. PostgreSQL PL/pgSQL 언어에서이 작업을 수행 할 수 있습니까? 나는 UTL_FILE 명령 을 사용하여 Oracle에서 이것을 수행했으며 비슷한 기능을 가진 PostgreSQL을 원했습니다. 당신이 줄 수있는 도움에 미리 감사드립니다.PostgreSQL의 I/O 파일 작업

파일 작업의 몇 가지 예를 제공하십시오.

 CREATE OR REPLACE FUNCTION NP_AC015_FETCH.proc_log (P_MSG text, P_MODE integer default 1) RETURNS VOID AS $body$ 
    DECLARE 

     V_F_IS_OPEN boolean;  --IF LOG FILE IS ALREADY OPEN THIS IS SET TO TRUE 
     V_LOG_MSG varchar(32767); --LOG FILE NAME 
     V_LOG_DIR varchar(30) := 'ND_GANJIS_LOG_DIR'; --LOG DIRECOTY 

     vTemp UTL_FILE.FILE_TYPE; 
    BEGIN 
     select get_var('GM_LOG_FILE') INTO vTemp; 

     V_F_IS_OPEN := utl_file.is_open(vTemp); 

     if not V_F_IS_OPEN then 

      -- Log File Open 
      -- 32767 IS THE MAXIMUM NUMBER OF CHARACTERS PER LINE, INCLUDING THE NEWLINE CHARACTER, FOR THIS FILE. 
      vTemp := UTL_FILE.FOPEN(V_LOG_DIR, 'NIA_PLSQL_'||to_char(clock_timestamp(), 'yyyymmdd')||'.log', 'A', 32767); 

     end if; 

     -- LOG MSG TO BE WRITTEN TO THE LOG FILE 
     V_LOG_MSG := TO_CHAR(CURRENT_TIMESTAMP, 'yyyy/mm/dd hh24:mi:ss:ff3') ||' '|| P_MSG; 

     --Output messages to a file 
     UTL_FILE.PUT_LINE(vTemp, V_LOG_MSG); 

    --Closing Log File 
    if P_MODE = current_setting('NP_AC015_FETCH.PV_LOG_CLOSE_MODE')::pls_integer and utl_file.is_open(vTemp) then 

      utl_file.fclose(vTemp); 

    end if; 

    --HERE THE EXCEPTION PART IS NOT INCLUDED, 
    --Reason: PROGRAM WILL GO ON INFINITE LOOP IF SOME ERROR OCCURS HERE, BECAUSE, EACH EXCEPTION WRITES INTO 
    --LOG FILE, USING THIS PROCEDURE. 
    exception 

    when others then 

     RAISE EXCEPTION '%', dbms_utility.format_error_backtrace||chr(10)||dbms_utility.format_error_stack||chr(10)||dbms_utility.format_call_stack, true; 

    END; 
$body$ 
LANGUAGE PLPGSQL; 
+0

외부 데이터 래퍼를 조회 할 수 있습니다. UTL_FILE과 비슷한 PostgreSQL에는 아무 것도 없습니다. https://wiki.postgresql.org/wiki/Foreign_data_wrappers#File_Wrappers – Jayadevan

+0

@Jayadevan ... 답장을 보내 주셔서 감사합니다. FDW를 사용하여 데이터를 텍스트 파일로 내보내는 방법에 대한 샘플 예제를 게시 할 수 있습니까? – User0123

+0

FDW가 읽기 전용 인 것처럼 보입니다. 이 SO 답변이 귀하의 요구 사항을 충족합니까? http://stackoverflow.com/questions/4897085/dynamically-generated-table-name-in-postgresql-copy-command 나는 약간 수정 된 버전의 코드를 테스트하여 효과가 있었다. 다음은 코드 생성 또는 바꾸기 함수입니다. dynamiccopy (tablename text, outname text)는 void를 $ body $ begin begin 형식으로 복사합니다 ('copy (select * from % s) to' '/tmp/%s.csv' '). ', tablename, outname); 끝 $ body $ language plpgsql; – Jayadevan

답변

0

당신은 adminpack있는 contrib 모듈을 설치하고 기능 pg_file_write(filename text, data text, append boolean)을 사용할 수 있습니다.

이 기능은 수퍼 유저 만 사용할 수 있지만 수퍼 유저가 소유 한 기능 (사용자가 선택한 기능에 필요한 기능을 제공)을 만들 수 있습니다.