2017-04-20 365 views
-1

私はPostgreSQLの新品です。 には、機能の結果をテキスト ファイルに書き込む方法を教えてくれる人が必要です。 PostgreSQL PL/pgSQL の言語でこれを行うことは可能ですか?私はこれまでOracleの中でUTL_FILEコマンド を使っていましたが、私は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

外部データラッパーを検索したい場合があります。 PostgreSQLにはUTL_FILEに似た何もありません。 https://wiki.postgresql.org/wiki/Foreign_data_wrappers#File_Wrappers – Jayadevan

+0

@Jayadevan ...あなたの返事をありがとう。 FDWを使用してデータをテキストファイルにエクスポートする方法のサンプル例を投稿してください。 – User0123

+0

FDWは読み取り専用です。これはあなたのニーズを満たす答えですか? http://stackoverflow.com/questions/4897085/dynamically-generated-table-name-in-postgresql-copy-command私は少し修正されたバージョンのコードをテストし、うまくいきました。ここでは、コードの作成または置換の機能があります。ダイナミックコピー(tablename text、outname text)は、voidを返します。 $ body $ begin フォーマットを実行します( 'コピー(選択*%s)から' /tmp/%s.csv '' '、tablename、outname); 末尾 $ body $ language plpgsql; – Jayadevan

答えて

0

あなたはadminpackのcontribモジュールをインストールし、機能pg_file_write(filename text, data text, append boolean)を使用することができます。

この機能はスーパーユーザーに限定されていますが、選択したユーザーに必要な機能を提供するスーパーユーザーが所有するSECURITY DEFINER機能を作成することができます。