PL/pgSQLからテキストファイルの読込みと書込みができます。
これらのファイル操作を行うには、あらかじめ1回、操作の対象となるディレクトリをUTL_FILE.UTL_FILE_DIRテーブルに登録する必要があります。データベース管理者またはINSERT権を持つユーザーがINSERT文を使用して登録します。また、不要となった場合には同じテーブルから削除してください。登録および削除の手順は、“9.5.2.1 ディレクトリの登録と削除”を参照してください。
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 | 書式付き文字列を書き込みます。 |
ここで示す例は、LinuxおよびSolarisの場合の例です。Windows(R)では、ディレクトリの区切り文字としてスラッシュ(/)を使用してください。
Windows(R)の例: 'c:/fsep'
デイレクトリの登録
ディレクトリの登録状況を確認します。すでに、登録されている場合は、手順2.の作業は不要です。
SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/fsep';
ディレクトリを登録します。
INSERT INTO UTL_FILE.UTL_FILE_DIR VALUES('/home/fsep');
ディレクトリの削除
DELETE FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/fsep';
UTL_FILEの各機能について説明します。
FCLOSEは、オープンしているファイルをクローズします。
ファイルハンドラはオープンしているファイルハンドラを指定します。
戻り値はNULL値です。
例
f := UTL_FILE.FCLOSE(f);
FCLOSE_ALLは、セッションでオープンしているすべてのファイルをクローズします。
FCLOSE_ALLでクローズされたファイルは、読み書きすることができなくなります。
例
PERFORM UTL_FILE.FCLOSE_ALL();
FCOPYは、複写元のファイルから複写先のファイルにコピーします。
複写元ディレクトリ名は複写元のファイルが存在するディレクトリ名を指定します。
複写元ファイル名は複写元のファイル名を指定します。
複写先ディレクトリ名は複写先のファイルを格納するディレクトリ名を指定します。
複写先ファイル名は複写先のファイル名を指定します。
複写元ディレクトリおよび複写先ディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。
先頭行は、複写するファイルの開始行番号を指定します。指定する場合は0より大きい値を指定してください。指定しない場合の開始行番号は1になります。
最終行は、複写するファイルの終了行番号を指定します。省略した場合はファイルの最終行番号になります。
例
Linux/Solarisの場合
PERFORM UTL_FILE.FCOPY('/home/fsep', 'regress_fsep.txt', '/home/fsep', 'regress_fsep2.txt');
Windows(R)の場合
PERFORM UTL_FILE.FCOPY('c:/fsep', 'regress_fsep.txt', 'c:/fsep', 'regress_fsep2.txt');
FFLUSHは、バッファの値を強制的にファイルに書き込みます。
ファイルハンドラはオープンしているファイルハンドラを指定します。
例
PERFORM UTL_FILE.FFLUSH(f);
FGETATTRは、ファイルの存在の有無、ファイルのサイズ、ファイルのブロックサイズの情報を取り出します。
ディレクトリ名は対象のファイルが存在するディレクトリ名を指定します。
ディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。
ファイル名は対象のファイル名を指定します。
取り出した情報は、SELECT文でfexists,file_length,blocksizeの列の値として取得します。
fexistsはBOOLEAN型です。ファイルが存在する場合は“真”の論理値、存在しない場合は“偽”の論理値になります。
file_lengthはINTEGER型です。ファイルの長さがバイト単位で設定されます。ファイルが存在しない場合はNULL値になります。
blocksizeはINTEGER型です。ファイルのブロックサイズがバイト単位で設定されます。ファイルが存在しない場合はNULL値になります。
例
Linux/Solarisの場合
SELECT fexists, file_length, blocksize INTO file_flag, file_chack_length, size FROM UTL_FILE.FGETATTR('/home/fsep', 'regress_fsep.txt');
Windows(R)の場合
SELECT fexists, file_length, blocksize INTO file_flag, file_chack_length, size FROM UTL_FILE.FGETATTR('c:/fsep', 'regress_fsep.txt');
FOPENは、ファイルをオープンします。
ディレクトリ名は対象のファイルが存在するディレクトリ名を指定します。
ディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。
ファイル名は対象のファイル名を指定します。
オープン方法はファイルをオープンする方法を指定します。以下を指定します。
r:読み込み
w:書き込み
a:追記
最大文字列長は、一回の操作で処理可能な最大の文字列長(バイト数)を指定します。省略された場合は、1024になります。1から32767の範囲で指定してください。
同時にオープンできる最大数は、1セッションにつき50ファイルです。
例
Linux/Solarisの場合
f := UTL_FILE.FOPEN('/home/fsep','regress_fsep.txt','r',1024);
Windows(R)の場合
f := UTL_FILE.FOPEN('c:/fsep','regress_fsep.txt','r',1024);
FRENAMEは、既存のファイル名を変更します。
変更前ディレクトリ名は変更前のファイルが存在するディレクトリです。
変更前ファイル名は変更前のファイル名です。
変更後ディレクトリ名は変更後のファイルが作成されるディレクトリです。
変更後ファイル名は変更後のファイル名です。
ディレクトリの区切り文字はスラッシュ(/)または円記号(\)で指定してください。
論理値は変更後のディレクトリにファイルがある場合に上書きするか否かを指定します。 “真”の論理値を指定した場合、変更後のファイルが存在しても上書きされます。“偽”の論理値を指定した場合、変更後のファイルが存在するとエラーになります。省略した場合、“偽”の論理値が設定されます。
参照
論理値については、“PostgreSQL文書”の“SQL言語”の“論理値データ型”を参照してください。
例
Linux/Solarisの場合
PERFORM UTL_FILE.FRENAME('/home/fsep', 'regress_fsep.txt', '/home/fsep', 'regress_fsep2.txt', TRUE);
Windows(R)の場合
PERFORM UTL_FILE.FRENAME('c:/fsep', 'regress_fsep.txt', 'c:/fsep', 'regress_fsep2.txt', TRUE);
GET_LINEは、ファイルから1行読み込みます。
ファイルハンドラはオープンしているファイルハンドラを指定します。FOPENのオープン方法でr(読み込み)でオープンしたファイルハンドラを指定してください。
読み込みサイズはファイルから読み込むバイト数です。省略した場合は、FOPENの最大文字列長の値になります。
戻り値は、ファイルから読み込まれた行を受け取るバッファです。
改行文字はバッファに読み込まれません。
ブランク行を読み込むと空文字列が返却されます。
読み込みサイズは読み込む値の最大サイズ(バイト数)を指定します。1から32767の範囲で指定してください。読み込みサイズを省略した場合、FOPENで最大文字列長を指定している場合はFOPENで指定した最大文字列長が設定され、FOPENで最大文字列長が設定されていない場合には1024が設定されます。
行の長さが読み込みサイズよりも大きい場合は読み込みサイズ分を読み込んで、残りは次回の呼び出しで読み込みます。
ファイルが最終行で、読み込む行がない場合は、NO_DATA_FOUND例外が発生します。
例
buff := UTL_FILE.GET_LINE(f);
IS_OPENは、ファイルがオープンされているか検査します。
ファイルハンドラは検査するファイルハンドラを指定します。
戻り値は、BOOLEAN型で、“真”の論理値の場合はオープン状態を表し、“偽”の場合はクローズ状態を表します。
参照
論理値については、“PostgreSQL文書”の“SQL言語”の“論理値データ型”を参照してください。
例
IF UTL_FILE.IS_OPEN(f) THEN PERFORM UTL_FILE.FCLOSE(f); END IF;
NEW_LINEは、1つ以上の改行を書き込みます。
ファイルハンドラはオープンしているファイルハンドラを指定します。
改行数はファイルに書き込む改行の数です。省略した場合は1が設定されます。
例
PERFORM UTL_FILE.NEW_LINE(f, 2);
PUTは、文字列をファイルに書き込みます。
ファイルハンドラはオープンしているファイルハンドラを指定します。FOPENのオープン方法でw(書き込み)またはa(追記)でオープンしたファイルハンドラを指定してください。
文字列はファイルに書き込む文字列を指定してください。
文字列の最大サイズ(バイト数)は、FOPENで指定した最大文字列長です。
PUTは改行を付加しないため、改行を付加する場合は、NEW_LINEを実行してください。
例
PERFORM UTL_FILE.PUT(f, 'ABC');
PUT_LINEは、文字列に改行を付加して書き込みます。
ファイルハンドラはオープンしているファイルハンドラを指定します。FOPENのオープン方法でw(書き込み)またはa(追記)でオープンしたファイルハンドラを指定してください。
論理値は強制的にファイルに書き込むか否かを指定します。“真”の論理値を指定した場合、強制的にファイルに書き込みます。“偽”の論理値を指定した場合、ファイルの書き込みは非同期になります。省略した場合、“偽”の論理値が設定されます。
文字列の最大サイズ(バイト数)は、FOPENで指定した最大文字列長の値です。
例
PERFORM UTL_FILE.PUT_LINE(f, 'ABC', TRUE);
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.UTL_FILE_DIRテーブルに登録します。
登録方法は、“9.5.2.1 ディレクトリの登録と削除”を参照してください。
業務の実施
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; /* Linux/Solarisの場合 */ SELECT gen_file('/home/fsep', 'input.txt', 'output.txt', 'copyfile.txt'); /* Windows(R)の場合 */ SELECT gen_file('c:/fsep', 'input.txt', 'output.txt', 'copyfile.txt');
事後処理
UTL_FILEを使用する業務を廃止した時に、UTL_FILE.UTL_FILE_DIRテーブルからディレクトリ情報を削除します。他の業務で使用していないことを確認してから実施してください。
削除方法は、“9.5.2.1 ディレクトリの登録と削除”を参照してください。