ページの先頭行へ戻る
Enterprise Postgres 12 アプリケーション開発ガイド
FUJITSU Software

9.5.2 UTL_FILE

概要

PL/pgSQLからテキストファイルの読込みと書込みができます。

これらのファイル操作を行うには、あらかじめ1回、操作の対象となるディレクトリをUTL_FILE.UTL_FILE_DIRテーブルに登録する必要があります。データベース管理者またはINSERT権を持つユーザーがINSERT文を使用して登録します。また、不要となった場合には同じテーブルから削除してください。登録および削除の手順は、“9.5.2.1 ディレクトリの登録と削除”を参照してください。

注意

  • ファイル操作を行う場合、操作に応じたUTL_FILEUTL_FILE_DIRテーブルへのアクセス権限が必要です。ただし、対象ファイルに対するOSのアクセス権に関わらず、ファイル操作を行うユーザーがファイルアクセス可能になることから、重要なファイルを任意のユーザーにアクセスされないよう、テーブルへのアクセス権限を適切に設定してください。

  • Windows(R)では使用できません。

UTL_FILE.UTL_FILE_DIRテーブルについては、“C.1 UTL_FILE.UTL_FILE_DIR”を参照してください。

以降で説明するファイルハンドラは、PL/pgSQLでは以下のように宣言してください。

DECLARE
f UTL_FILE.FILE_TYPE;

機能

機能

説明

FCLOSE

指定したファイルをクローズします。

FCLOSE_ALL

セッションでオープンしているすべてのファイルをクローズします。

FCOPY

ファイルをコピーします。

FFLUSH

バッファのフラッシュを行います。

FGETATTR

ファイルの存在有無とサイズ情報を取得します。

FOPEN

ファイルをオープンします。

FRENAME

ファイルの名前を変更します。

GET_LINE

テキストファイルから1行読み込みます。

IS_OPEN

ファイルがオープンされているか否かを検査します。

NEW_LINE

改行を書き込みます。

PUT

文字列を書き込みます。

PUT_LINE

文字列に改行を付加して書き込みます。

PUTF

書式付き文字列を書き込みます。

記述形式
{ FCLOSE(fileHandle)
| FCLOSE_ALL()
| FCOPY(srcDir, srcFileName, destDir, destFileName [ {,startLine | ,startLine ,endLine } ])
| FFLUSH(fileHandle)
| FGETATTR(dir, filename)
| FOPEN(dir, fileName, openMode [, maxLineSize ])
| FRENAME(srcDir, srcFileName, destDir, destFileName [ ,overwrite ])
| GET_LINES(fileHandle [,len ]) 
| IS_OPEN(fileHandle)
| NEW_LINE(fileHandle [, numOfNewLines ])
| PUT(fileHandle, str)
| PUT_LINE(fileHandle, str [, writeToFile ])
| PUTF(fileHandle, fmt [, args ]... ]) 
}

9.5.2.1 ディレクトリの登録と削除

デイレクトリの登録

  1. ディレクトリの登録状況を確認します。すでに、登録されている場合は、手順2.の作業は不要です。

    SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/fsep';
  2. ディレクトリを登録します。

    INSERT INTO UTL_FILE.UTL_FILE_DIR VALUES('/home/fsep');

ディレクトリの削除

DELETE FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/fsep';

9.5.2.2 機能説明

UTL_FILEの各機能について説明します。


FCLOSE
  • FCLOSEは、オープンしているファイルをクローズします。

  • ファイルハンドラ(fileHandle)はオープンしているファイルハンドラを指定します。

  • 戻り値はNULL値です。

f := UTL_FILE.FCLOSE(f);

FCLOSE_ALL
  • FCLOSE_ALLは、セッションでオープンしているすべてのファイルをクローズします。

  • FCLOSE_ALLでクローズされたファイルは、読み書きすることができなくなります。

PERFORM UTL_FILE.FCLOSE_ALL();

FCOPY
  • FCOPYは、複写元のファイルから複写先のファイルにコピーします。

  • 複写元ディレクトリ名(srcDir)は複写元のファイルが存在するディレクトリ名を指定します。

  • 複写元ファイル名(srcFileName)は複写元のファイル名を指定します。

  • 複写先ディレクトリ名(destDir)は複写先のファイルを格納するディレクトリ名を指定します。

  • 複写先ファイル名(destFileName)は複写先のファイル名を指定します。

  • 先頭行(startLine)は、複写するファイルの開始行番号を指定します。指定する場合は0より大きい値を指定してください。指定しない場合の開始行番号は1になります。

  • 最終行(endLine)は、複写するファイルの終了行番号を指定します。省略した場合はファイルの最終行番号になります。

PERFORM UTL_FILE.FCOPY('/home/fsep', 'regress_fsep.txt', '/home/fsep', 'regress_fsep2.txt');

FFLUSH
  • FFLUSHは、バッファの値を強制的にファイルに書き込みます。

  • ファイルハンドラ(fileHandle)はオープンしているファイルハンドラを指定します。

PERFORM UTL_FILE.FFLUSH(f);

FGETATTR
  • FGETATTRは、ファイルの存在の有無、ファイルのサイズ、ファイルのブロックサイズの情報を取り出します。

  • ディレクトリ名(dir)は対象のファイルが存在するディレクトリ名を指定します。

  • ファイル名(filename)は対象のファイル名を指定します。

  • 取り出した情報は、SELECT文でfexists,file_length,blocksizeの列の値として取得します。

  • fexistsはBOOLEAN型です。ファイルが存在する場合は“真”の論理値、存在しない場合は“偽”の論理値になります。

  • file_lengthはINTEGER型です。ファイルの長さがバイト単位で設定されます。ファイルが存在しない場合はNULL値になります。

  • blocksizeはINTEGER型です。ファイルのブロックサイズがバイト単位で設定されます。ファイルが存在しない場合はNULL値になります。

SELECT fexists, file_length, blocksize INTO file_flag, file_chack_length, size FROM UTL_FILE.FGETATTR('/home/fsep', 'regress_fsep.txt');

FOPEN
  • FOPENは、ファイルをオープンします。

  • ディレクトリ名(dir)は対象のファイルが存在するディレクトリ名を指定します。

  • ファイル名(filename)は対象のファイル名を指定します。

  • オープン方法(openMode)はファイルをオープンする方法を指定します。以下を指定します。
    r:読み込み
    w:書き込み
    a:追記

  • 最大文字列長(maxLineSize)は、一回の操作で処理可能な最大の文字列長(バイト数)を指定します。省略された場合は、1024になります。1から32767の範囲で指定してください。

  • 同時にオープンできる最大数は、1セッションにつき50ファイルです。

f := UTL_FILE.FOPEN('/home/fsep','regress_fsep.txt','r',1024);

FRENAME
  • FRENAMEは、既存のファイル名を変更します。

  • 変更前ディレクトリ名(srcDir)は変更前のファイルが存在するディレクトリです。

  • 変更前ファイル名(srcFileName)は変更前のファイル名です。

  • 変更後ディレクトリ名(destDir)は変更後のファイルが作成されるディレクトリです。

  • 変更後ファイル名(destFileName)は変更後のファイル名です。

  • 論理値(overwite)は変更後のディレクトリにファイルがある場合に上書きするか否かを指定します。 “真”の論理値を指定した場合、変更後のファイルが存在しても上書きされます。“偽”の論理値を指定した場合、変更後のファイルが存在するとエラーになります。省略した場合、“偽”の論理値が設定されます。

    参照

    論理値については、“PostgreSQL Documentation”の“The SQL Language”の“Boolean Type”を参照してください。

PERFORM UTL_FILE.FRENAME('/home/fsep', 'regress_fsep.txt', '/home/fsep',
 'regress_fsep2.txt', TRUE);

GET_LINE
  • GET_LINEは、ファイルから1行読み込みます。

  • ファイルハンドラ(fileHandle)はオープンしているファイルハンドラを指定します。FOPENのオープン方法でr(読み込み)でオープンしたファイルハンドラを指定してください。

  • 読み込みサイズ(len)はファイルから読み込むバイト数です。省略した場合は、FOPENの最大文字列長の値になります。

  • 戻り値は、ファイルから読み込まれた行を受け取るバッファです。

  • 改行文字はバッファに読み込まれません。

  • ブランク行を読み込むと空文字列が返却されます。

  • 読み込みサイズは読み込む値の最大サイズ(バイト数)を指定します。1から32767の範囲で指定してください。読み込みサイズを省略した場合、FOPENで最大文字列長を指定している場合はFOPENで指定した最大文字列長が設定され、FOPENで最大文字列長が設定されていない場合には1024が設定されます。

  • 行の長さが読み込みサイズよりも大きい場合は読み込みサイズ分を読み込んで、残りは次回の呼び出しで読み込みます。

  • ファイルが最終行で、読み込む行がない場合は、NO_DATA_FOUND例外が発生します。

buff := UTL_FILE.GET_LINE(f);

IS_OPEN
  • IS_OPENは、ファイルがオープンされているか検査します。

  • ファイルハンドラ(fileHandle)は検査するファイルハンドラを指定します。

  • 戻り値は、BOOLEAN型で、“真”の論理値の場合はオープン状態を表し、“偽”の場合はクローズ状態を表します。

    参照

    論理値については、“PostgreSQL Documentation”の“The SQL Language”の“Boolean Type”を参照してください。

IF UTL_FILE.IS_OPEN(f) THEN
   PERFORM UTL_FILE.FCLOSE(f);
END IF;

NEW_LINE
  • NEW_LINEは、1つ以上の改行を書き込みます。

  • ファイルハンドラ(fileHandle)はオープンしているファイルハンドラを指定します。

  • 改行数(numOfNewlines)はファイルに書き込む改行の数です。省略した場合は1が設定されます。

PERFORM UTL_FILE.NEW_LINE(f, 2);

PUT
  • PUTは、文字列(str)をファイルに書き込みます。

  • ファイルハンドラ(fileHandle)はオープンしているファイルハンドラを指定します。FOPENのオープン方法でw(書き込み)またはa(追記)でオープンしたファイルハンドラを指定してください。

  • 文字列はファイルに書き込む文字列を指定してください。

  • 文字列の最大サイズ(バイト数)は、FOPENで指定した最大文字列長です。

  • PUTは改行を付加しないため、改行を付加する場合は、NEW_LINEを実行してください。

PERFORM UTL_FILE.PUT(f, 'ABC');

PUT_LINE
  • PUT_LINEは、文字列(str)に改行を付加して書き込みます。

  • ファイルハンドラ(fileHandle)はオープンしているファイルハンドラを指定します。FOPENのオープン方法でw(書き込み)またはa(追記)でオープンしたファイルハンドラを指定してください。

  • 論理値(writeToFile)は強制的にファイルに書き込むか否かを指定します。“真”の論理値を指定した場合、強制的にファイルに書き込みます。“偽”の論理値を指定した場合、ファイルの書き込みは非同期になります。省略した場合、“偽”の論理値が設定されます。

  • 文字列の最大サイズ(バイト数)は、FOPENで指定した最大文字列長の値です。

PERFORM UTL_FILE.PUT_LINE(f, 'ABC', TRUE);

PUTF
  • PUTFは、書式化を利用して文字列を書き込みます。

  • ファイルハンドラ(fileHandle)はオープンしているファイルハンドラを指定します。FOPENのオープン方法でw(書き込み)またはa(追記)でオープンしたファイルハンドラを指定してください。

  • フォーマット(args)は書式文字\nと%sを含む文字列です。

  • フォーマットの\nは改行コードになります。

  • 入力値はフォーマットの中の%sの数だけ指定します。入力値は最大5個まで指定できます。フォーマットの中の%sは対応する入力文字に置き換わります。%sに対応する入力値が指定されていない場合は空文字列に置き換わります。

PERFORM UTL_FILE.PUTF(f, '[1=%s, 2=%s, 3=%s, 4=%s, 5=%s]\n', '1', '2', '3', '4', '5');

9.5.2.3 使用例

UTL_FILEを使用する際の手順と使用例を示します。

  1. 事前準備

    UTL_FILEを使用する新規業務を開始する前にディレクトリをUTL_FILE.UTL_FILE_DIRテーブルに登録します。

    登録方法は、“9.5.2.1 ディレクトリの登録と削除”を参照してください。

  2. 業務の実施

    UTL_FILEを使用した業務を実施します。以下に使用例を示します。

    CREATE OR REPLACE FUNCTION gen_file(mydir TEXT, infile TEXT, outfile TEXT, copyfile TEXT) RETURNS void AS $$
    DECLARE
      v1 VARCHAR(32767);
      inf UTL_FILE.FILE_TYPE;
      otf UTL_FILE.FILE_TYPE;
    BEGIN
      inf := UTL_FILE.FOPEN(mydir, infile,'r',256);
      otf := UTL_FILE.FOPEN(mydir, outfile,'w');
      v1 := UTL_FILE.GET_LINE(inf,256);
      PERFORM UTL_FILE.PUT_LINE(otf,v1,TRUE);
      v1 := UTL_FILE.GET_LINE(inf,256);
      PERFORM UTL_FILE.PUTF(otf,'%s\n',v1);
      v1 := UTL_FILE.GET_LINE(inf, 256);
      PERFORM UTL_FILE.PUT(otf,v1);
      PERFORM UTL_FILE.NEW_LINE(otf);
      PERFORM UTL_FILE.FFLUSH(otf);
    
      inf := UTL_FILE.FCLOSE(inf);
      otf := UTL_FILE.FCLOSE(otf);
    
      PERFORM UTL_FILE.FCOPY(mydir, outfile, mydir, copyfile, 2, 3);
      PERFORM UTL_FILE.FRENAME(mydir, outfile, mydir, 'rename.txt');
    
    END;
    $$ LANGUAGE plpgsql;
    
    SELECT gen_file('/home/fsep', 'input.txt', 'output.txt', 'copyfile.txt');
  3. 事後処理

    UTL_FILEを使用する業務を廃止した時に、UTL_FILE.UTL_FILE_DIRテーブルからディレクトリ情報を削除します。他の業務で使用していないことを確認してから実施してください。

    削除方法は、“9.5.2.1 ディレクトリの登録と削除”を参照してください。