ページの先頭行へ戻る
Symfoware Server V12.0.0 アプリケーション開発ガイド
FUJITSU Software

7.5.2 UTL_FILE

概要

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

機能

機能

説明

FCLOSE

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

FCLOSE_ALL

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

FCOPY

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

FFLUSH

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

FGETATTR

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

FOPEN

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

FRENAME

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

GET_LINE

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

IS_OPEN

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

NEW_LINE

改行を書き込みます。

PUT

文字列を書き込みます。

PUT_LINE

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

PUTF

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

記述形式

ファイルハンドラの型はUTL_FILE.FILE_TYPEです。以下に定義例を示します。

DECLARE
f UTL_FILE.FILE_TYPE;
一般規則
FCLOSE

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

注意

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

  • 戻り値はNULL値です。

f := UTL_FILE.FCLOSE(f);
FCLOSE_ALL

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

注意

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

PERFORM UTL_FILE.FCLOSE_ALL();
FCOPY

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

注意

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

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

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

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

  • Windows複写元ディレクトリおよび複写先ディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。

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

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

  • 複写元ディレクトリと複写先ディレクトリで指定するディレクトリは、あらかじめ1回、UTL_FILE.UTL_FILE_DIRテーブルに対してINSERT文を使用して登録する必要があります。

  • WindowsUTL_FILE.UTL_FILE_DIRテーブルに登録するディレクトリの区切り文字はスラッシュ(/)で指定してください。

SolarisLinuxSolarisおよびLinuxの場合

PERFORM UTL_FILE.FCOPY('/home/symfo', 'regress_symfo.txt', '/home/symfo', 'regress_symfo2.txt');

WindowsWindows(R)の場合

PERFORM UTL_FILE.FCOPY('c:/symfo', 'regress_symfo.txt', 'c:/symfo', 'regress_symfo2.txt');

ディレクトリを登録する例は、以下のとおりです。

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

SolarisLinuxSolarisおよびLinuxの場合

SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/symfo';

WindowsWindows(R)の場合

SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='c:/symfo';

2) ディレクトリを登録します。

SolarisLinuxSolarisおよびLinuxの場合

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

WindowsWindows(R)の場合

INSERT INTO UTL_FILE.UTL_FILE_DIR VALUES('c:/symfo');

ディレクトリ情報を削除する例は、以下のとおりです。

SolarisLinuxSolarisおよびLinuxの場合

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

WindowsWindows(R)の場合

DELETE FROM UTL_FILE.UTL_FILE_DIR WHERE dir='c:/symfo';
FFLUSH

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

注意

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

PERFORM UTL_FILE.FFLUSH(f);
FGETATTR

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

注意

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

  • Windowsディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。

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

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

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

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

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

  • ディレクトリ名で指定するディレクトリは、あらかじめ1回、UTL_FILE.UTL_FILE_DIRテーブルに対してINSERT文を使用して登録する必要があります。

  • WindowsUTL_FILE.UTL_FILE_DIRテーブルに登録するディレクトリの区切り文字はスラッシュ(/)で指定してください。

SolarisLinuxSolarisおよびLinuxの場合

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

WindowsWindows(R)の場合

SELECT fexists, file_length, blocksize INTO file_flag, file_chack_length, size FROM UTL_FILE.FGETATTR('c:/symfo', 'regress_symfo.txt');

UTL_FILE.UTL_FILE_DIRテーブルに対してディレクトリを登録する例は、“FCOPY”を参照してください。

FOPEN

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

注意

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

  • Windowsディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。

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

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

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

  • ディレクトリ名で指定するディレクトリは、あらかじめ1回、UTL_FILE.UTL_FILE_DIRテーブルに対してINSERT文を使用して登録する必要があります。

  • WindowsUTL_FILE.UTL_FILE_DIRテーブルに登録するディレクトリの区切り文字はスラッシュ(/)で指定してください。

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

SolarisLinuxSolarisおよびLinuxの場合

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

WindowsWindows(R)の場合

f := UTL_FILE.FOPEN('c:/symfo','regress_symfo.txt','r',1024);

UTL_FILE.UTL_FILE_DIRテーブルに対してディレクトリを登録する例は、“FCOPY”を参照してください。

FRENAME

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

注意

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

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

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

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

  • Windowsディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。

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

  • 論理値については、“PostgreSQL文書”の“SQL言語”の“論理値データ型”を参照してください。

  • 変更前ディレクトリ名と変更後ディレクトリ名で指定するディレクトリは、あらかじめ1回、UTL_FILE.UTL_FILE_DIRテーブルに対してINSERT文を使用して登録する必要があります。

  • WindowsUTL_FILE.UTL_FILE_DIRテーブルに登録するディレクトリの区切り文字はスラッシュ(/)で指定してください。

SolarisLinuxSolarisおよびLinuxの場合

PERFORM UTL_FILE.FRENAME('/home/symfo', 'regress_symfo.txt', '/home/symfo',
 'regress_symfo2.txt', TRUE);

WindowsWindows(R)の場合

PERFORM UTL_FILE.FRENAME('c:/symfo', 'regress_symfo.txt', 'c:/symfo',
 'regress_symfo2.txt', TRUE);

UTL_FILE.UTL_FILE_DIRテーブルに対してディレクトリを登録する例は、“FCOPY”を参照してください

GET_LINE

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

注意

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

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

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

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

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

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

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

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

buff := UTL_FILE.GET_LINE(f);
IS_OPEN

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

注意

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

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

参照

論理値については、“PostgreSQL文書”の“SQL言語”の“論理値データ型”を参照してください。

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

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

注意

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

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

PERFORM UTL_FILE.NEW_LINE(f, 2);
PUT

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

注意

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

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

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

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

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

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

注意

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

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

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

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

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

注意

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

  • フォーマットは書式文字\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');

手順と使用例を示します。

  • 事前準備

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

    新規業務を開始する前に1回実施してください。SELECT文で登録状況を確認し、登録されていない場合はINSERT文で登録してください。

    [使用例]

    SolarisLinuxSolarisおよびLinuxの場合

    SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/symfo';
    INSERT INTO UTL_FILE.UTL_FILE_DIR(dir) VALUES('/home/symfo');

    WindowsWindows(R)の場合

    SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='c:/symfo';
    INSERT INTO UTL_FILE.UTL_FILE_DIR(dir) VALUES('c:/symfo');
  • 業務の実施

    UTL_FILEを使用した業務を実施します。

    [使用例]

    SolarisLinuxSolarisおよびLinuxの場合

    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/symfo', 'input.txt', 'output.txt', 'copyfile.txt');

    WindowsWindows(R)の場合

    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('c:/symfo', 'input.txt', 'output.txt', 'copyfile.txt');
  • 事後処理

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

    [使用例]

    SolarisLinuxSolarisおよびLinuxの場合

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

    WindowsWindows(R)の場合

    DELETE FROM UTL_FILE.UTL_FILE_DIR WHERE dir='c:/symfo';