UTL_FILE

UTL_FILE パッケージは、オペレーティングシステムのファイルシステム上のファイルを読み書きする機能を提供します。非スーパーユーザーは、パッケージ内の関数または手順を使用する前に、スーパーユーザーによって UTL_FILE パッケージに対する EXECUTE 特権を付与されている必要があります。たとえば、次のコマンドは、ユーザー mary に特権を付与します。

GRANT EXECUTE ON PACKAGE SYS.UTL_FILE TO mary;

また、オペレーティングシステムのユーザー名 enterprisedb には、 UTL_FILE 関数および手順を使用してアクセスするディレクトリおよびファイルに対する適切な読み取りおよび/または書き込み権限が必要です。必要なファイル許可が設定されていない場合、 UTL_FILE 関数またはプロシージャで例外がスローされます。

書き込みまたは読み取り対象のファイルへのハンドルは、ファイルを参照するために使用されます。ファイルハンドル は、 UTL_FILE.FILE_TYPE という名前の UTL_FILE パッケージ内のパブリック変数によって定義されます。 FOPEN 関数を呼び出して返されたファイルハンドルを受け取るには、 FILE_TYPE 型の変数を宣言する必要があります。ファイルハンドルは、ファイルに対する以降のすべての操作に使用されます。

ファイルシステム上のディレクトリへの参照は、 CREATE DIRECTORY コマンドを使用してディレクトリに割り当てられたディレクトリ名またはエイリアスを使用して行われます。

UTL_FILE パッケージで使用可能な手順と機能を次の表に示します。

機能/手順

戻りタイプ

説明

FCLOSE(file IN OUT)

該当なし

file で識別される指定されたファイルを閉じます。

FCLOSE_ALL

該当なし

開いているファイルをすべて閉じます。

FCOPY(location, filename, dest_dir, dest_file [, start_line [, end_line ] ])

該当なし

location で識別されるディレクトリ内の filename を、 start_line 行から end_line 行まで、ディレクトリ dest_dir 内のファイル dest_file にコピーします。

FFLUSH(file)

該当なし

バッファ内のデータを file で識別されるファイル内のディスクに強制的に書き込みます。

FOPEN(location, filename, open_mode [, max_linesize ])

FILE_TYPE

location で識別されるディレクトリ内のファイル filename を開きます。

FREMOVE(location, filename)

該当なし

指定したファイルをファイルシステムから削除します。

FRENAME(location, filename, dest_dir, dest_file [, overwrite ])

該当なし

指定されたファイルの名前を変更します。

GET_LINE(file, buffer OUT)

該当なし

file で識別されるファイルからテキスト行を変数 buffer に読み込みます。

IS_OPEN(file)

BOOLEAN

指定されたファイルが開いているかどうかを決定します。

NEW_LINE(file [, lines ])

該当なし

行末文字シーケンスをファイルに書き込みます。

PUT(file, buffer)

該当なし

指定されたファイルに buffer を書き込みます。 PUT は行末文字シーケンスを書き込みません。

PUT_LINE(file, buffer)

該当なし

指定されたファイルに buffer を書き込みます。行末文字シーケンスは、 PUT_LINE 手順によって追加されます。

PUTF(file, format [, arg1 ] [, ...])

該当なし

指定されたファイルにフォーマットされた文字列を書き込みます。最大5つの置換パラメーター、 arg1,...arg5 を指定して format の置換を指定できます。

AdvancedServerの UTL_FILE の実装は、Oracleのバージョンと比較すると部分的な実装です。上記の表にリストされている関数と手順のみがサポートされています。

UTL_FILE Exception Codes

UTL_FILE プロシージャまたは関数の呼び出しで例外が発生した場合、条件名を使用して例外をキャッチできます。 UTL_FILE パッケージは、Oracleデータベースと互換性のある次の例外コードを報告します。

Exception Code

Condition name

-29283

無効な操作

-29285

write_error

-29284

read_error

-29282

invalid_filehandle

-29287

invalid_maxlinesize

-29281

invalid_mode

-29280

invalid_path

Setting File Permissions with utl_file.umask

UTL_FILE 関数またはプロシージャがファイルを作成するとき、次のようにデフォルトのファイル許可があります。

-rw------- 1 enterprisedb enterprisedb 21 Jul 24 16:08 utlfile

enterprisedb グループに属するユーザーおよび他のすべてのユーザーに対するすべての権限が拒否されることに注意してください。 enterprisedb ユーザーのみが、作成されたファイルに対する読み取りおよび書き込み権限を持ちます。

UTL_FILE 関数および手順によって作成されたファイルに異なるファイル許可セットを設定する場合は、 utl_file.umask 構成パラメーターを設定することでこれを実現できます。

utl_file.umask パラメータは、Linuxの umask コマンドと同様の方法で、ファイルモード作成マスク、または単に*mask* を設定します。これは、AdvancedServer UTL_FILE パッケージ内でのみ使用されます。

注釈

utl_file.umask パラメーターは、Windowsシステムではサポートされていません。

utl_file.umask に指定される値は、Linuxの umask コマンドに有効な3文字または4文字の8進数文字列です。この設定により、 UTL_FILE 関数および手順によって作成されたファイルの権限が決まります。(ファイル許可と umask コマンドの使用法については、LinuxまたはUnixシステムに関する情報源を参照してください。)

以下は、ファイル許可を utl_file.umask で設定する例です。

まず、 UTL_FILE パッケージが使用するファイルシステムのディレクトリを設定します。オペレーティングシステムアカウント enterprisedb または postgres のどちらか適切な方が、ディレクトリで読み書きできることを確認してください。

mkdir /tmp/utldir
chmod 777 /tmp/utldir

psqlCREATE DIRECTORY コマンドを発行して、前の手順で作成したファイルシステムディレクトリを使用してディレクトリデータベースオブジェクトを作成します。

CREATE DIRECTORY utldir AS '/tmp/utldir';

utl_file.umask 構成パラメーターを設定します。次の設定では、ファイルの所有者に許可が与えられます。グループユーザーと他のユーザーには、実行権限以外のすべての権限が許可されます。

SET utl_file.umask TO '0011';

utl_file.umask パラメーターが目的の値に設定されている同じセッションで、 UTL_FILE 関数と手順を実行します。

DECLARE
    v_utlfile       UTL_FILE.FILE_TYPE;
    v_directory     VARCHAR2(50) := 'utldir';
    v_filename      VARCHAR2(20) := 'utlfile';
BEGIN
    v_utlfile := UTL_FILE.FOPEN(v_directory, v_filename, 'w');
    UTL_FILE.PUT_LINE(v_utlfile, 'Simple one-line file');
    DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
    UTL_FILE.FCLOSE(v_utlfile);
END;

結果のファイルのアクセス許可設定は、グループユーザーと他のユーザーが、ファイルとファイル所有者の読み取りおよび書き込みアクセス許可を持っていることを示しています。

$ pwd
/tmp/utldir
$ ls -l
total 4
-rw-rw-rw- 1 enterprisedb enterprisedb 21 Jul 24 16:04 utlfile

このパラメーターは、 ALTER ROLE コマンドを使用してロールごとに、 ALTER DATABASE コマンドを使用してデータベースごとに、または postgresql.conf ファイルに設定することでデータベースサーバーインスタンス全体に設定することもできます。

FCLOSE

FCLOSE プロシージャは、開いているファイルを閉じます。

FCLOSE(<file> IN OUT FILE_TYPE)

Parameters

file

閉じられるファイルのファイルハンドルを含む FILE_TYPE 型の変数。

FCLOSE_ALL

FLCLOSE_ALL プロシージャは、開いているファイルをすべて閉じます。クローズするオープンファイルがない場合でも、プロシージャは正常に実行されます。

FCLOSE_ALL

FCOPY

FCOPY プロシージャは、あるファイルから別のファイルにテキストをコピーします。

FCOPY(<location> VARCHAR2, <filename> VARCHAR2,
  <dest_dir> VARCHAR2, <dest_file> VARCHAR2
  [, <start_line> PLS_INTEGER [, <end_line> PLS_INTEGER ] ])

Parameters

location

コピーするファイルを含むディレクトリの pg_catalog.edb_dir.dirname に格納されているディレクトリ名。

filename

コピーするソースファイルの名前。

dest_dir

pg_catalog.edb_dir.dirname に保存されている、ファイルのコピー先ディレクトリのディレクトリ名。

dest_file

宛先ファイルの名前。

start_line

コピーを開始するソースファイルの行番号。デフォルトは1です。

end_line

コピーするソースファイルの最後の行の行番号。省略またはヌルの場合、コピーはファイルの最終行に移動します。

Examples

以下は、 emp テーブルの従業員のカンマ区切りリストを含む C:/TEMP/EMPDIR/empfile.csv ファイルのコピーを作成します。コピー empcopy.csv がリストされます。

CREATE DIRECTORY empdir AS 'C:/TEMP/EMPDIR';

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_src_dir       VARCHAR2(50) := 'empdir';
    v_src_file      VARCHAR2(20) := 'empfile.csv';
    v_dest_dir      VARCHAR2(50) := 'empdir';
    v_dest_file     VARCHAR2(20) := 'empcopy.csv';
    v_emprec        VARCHAR2(120);
    v_count         INTEGER := 0;
BEGIN
    UTL_FILE.FCOPY(v_src_dir,v_src_file,v_dest_dir,v_dest_file);
    v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');
    DBMS_OUTPUT.PUT_LINE('The following is the destination file, ''' ||
        v_dest_file || '''');
    LOOP
        UTL_FILE.GET_LINE(v_empfile,v_emprec);
        DBMS_OUTPUT.PUT_LINE(v_emprec);
        v_count := v_count + 1;
    END LOOP;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            UTL_FILE.FCLOSE(v_empfile);
            DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
            DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;

The following is the destination file, 'empcopy.csv'
7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30
7566,JONES,MANAGER,7839,02-APR-81,2975,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,1400,30
7698,BLAKE,MANAGER,7839,01-MAY-81,2850,,30
7782,CLARK,MANAGER,7839,09-JUN-81,2450,,10
7788,SCOTT,ANALYST,7566,19-APR-87,3000,,20
7839,KING,PRESIDENT,,17-NOV-81,5000,,10
7844,TURNER,SALESMAN,7698,08-SEP-81,1500,0,30
7876,ADAMS,CLERK,7788,23-MAY-87,1100,,20
7900,JAMES,CLERK,7698,03-DEC-81,950,,30
7902,FORD,ANALYST,7566,03-DEC-81,3000,,20
7934,MILLER,CLERK,7782,23-JAN-82,1300,,10
14 records retrieved

FFLUSH

FFLUSH プロシージャは、書き込みバッファからファイルに未書き込みデータをフラッシュします。

FFLUSH(<file> FILE_TYPE)

Parameters

file

ファイルハンドルを含む FILE_TYPE 型の変数。

Examples

NEW_LINE プロシージャが呼び出された後、各行がフラッシュされます。

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_directory     VARCHAR2(50) := 'empdir';
    v_filename      VARCHAR2(20) := 'empfile.csv';
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
    v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
    FOR i IN emp_cur LOOP
        UTL_FILE.PUT(v_empfile,i.empno);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.ename);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.job);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.mgr);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.hiredate);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.sal);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.comm);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.deptno);
        UTL_FILE.NEW_LINE(v_empfile);
        UTL_FILE.FFLUSH(v_empfile);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
    UTL_FILE.FCLOSE(v_empfile);
END;

FOPEN

FOPEN 関数は、I/O用のファイルを開きます。

filetype FILE_TYPE FOPEN(<location> VARCHAR2,
  <filename> VARCHAR2,<open_mode> VARCHAR2
  [, <max_linesize> BINARY_INTEGER ])

Parameters

location

pg_catalog.edb_dir.dirname に保存されている、開くファイルを含むディレクトリのディレクトリ名。

filename

開くファイルの名前。

open_mode

ファイルが開かれるモード。モードは次のとおりです。 a -ファイルに追加します。 r -ファイルから読み取ります。 w -ファイルに書き込みます。

max_linesize

文字の行の最大サイズ。読み取りモードでは、 max_linesize を超える行を読み取ろうとすると例外がスローされます。書き込みモードと追加モードでは、 max_linesize を超える行を書き込もうとすると、例外がスローされます。行末文字は、最大行サイズを超えているかどうかの判断には含まれません。この動作は、Oracleデータベースと互換性がありません。Oracleは、行末文字をカウントします。

filetype

開かれたファイルのファイルハンドルを含む FILE_TYPE タイプの変数。

FREMOVE

FREMOVE プロシージャは、システムからファイルを削除します。

FREMOVE(<location> VARCHAR2, <filename> VARCHAR2)

削除するファイルが存在しない場合、例外がスローされます。

Parameters

location

削除するファイルを含むディレクトリの pg_catalog.edb_dir.dirname に格納されているディレクトリ名。

filename

削除するファイルの名前。

Examples

以下はファイル empfile.csv を削除します。

DECLARE
    v_directory     VARCHAR2(50) := 'empdir';
    v_filename      VARCHAR2(20) := 'empfile.csv';
BEGIN
    UTL_FILE.FREMOVE(v_directory,v_filename);
    DBMS_OUTPUT.PUT_LINE('Removed file: ' || v_filename);
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
            DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;

Removed file: empfile.csv

FRENAME

FRENAME プロシージャは、指定されたファイルの名前を変更します。これにより、ファイルをある場所から別の場所に効果的に移動できます。

FRENAME(<location> VARCHAR2, <filename> VARCHAR2,
  <dest_dir> VARCHAR2, <dest_file> VARCHAR2,
  [ <overwrite> BOOLEAN ])

Parameters

location

名前を変更するファイルを含むディレクトリの pg_catalog.edb_dir.dirname に格納されているディレクトリ名。

filename

名前を変更するソースファイルの名前。

dest_dir

pg_catalog.edb_dir.dirname に保存されている、名前が変更されたファイルが存在するディレクトリのディレクトリ名。

dest_file

元のファイルの新しい名前。

overwrite

TRUE に設定されている場合は dest_dirdest_file という名前の既存ファイルを置き換えます。 FALSE に設定されている場合は例外がスローされます。これがデフォルトです。

Examples

以下は、 emp テーブルの従業員のカンマ区切りリストを含むファイル C:/TEMP/EMPDIR/empfile.csv の名前を変更します。名前が変更されたファイル C:/TEMP/NEWDIR/newemp.csv が一覧表示されます。

CREATE DIRECTORY "newdir" AS 'C:/TEMP/NEWDIR';

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_src_dir       VARCHAR2(50) := 'empdir';
    v_src_file      VARCHAR2(20) := 'empfile.csv';
    v_dest_dir      VARCHAR2(50) := 'newdir';
    v_dest_file     VARCHAR2(50) := 'newemp.csv';
    v_replace       BOOLEAN := FALSE;
    v_emprec        VARCHAR2(120);
    v_count         INTEGER := 0;
BEGIN
    UTL_FILE.FRENAME(v_src_dir,v_src_file,v_dest_dir,
        v_dest_file,v_replace);
    v_empfile := UTL_FILE.FOPEN(v_dest_dir,v_dest_file,'r');
    DBMS_OUTPUT.PUT_LINE('The following is the renamed file, ''' ||
        v_dest_file || '''');
    LOOP
        UTL_FILE.GET_LINE(v_empfile,v_emprec);
        DBMS_OUTPUT.PUT_LINE(v_emprec);
        v_count := v_count + 1;
    END LOOP;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            UTL_FILE.FCLOSE(v_empfile);
            DBMS_OUTPUT.PUT_LINE(v_count || ' records retrieved');
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
            DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;

The following is the renamed file, 'newemp.csv'
7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
14 records retrieved

GET_LINE

GET_LINE プロシージャは、指定されたファイルからテキストの行を読み取りますが、行末ターミネータは含みません。読み取る行がなくなると、 NO_DATA_FOUND 例外がスローされます。

GET_LINE(<file> FILE_TYPE, <buffer> OUT VARCHAR2)

Parameters

file

開かれたファイルのファイルハンドルを含む FILE_TYPE タイプの変数。

buffer

ファイルから行を受け取る変数。

Examples

次の匿名ブロックは、ファイル empfile.csv のレコードを読み取り、表示します。

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_directory     VARCHAR2(50) := 'empdir';
    v_filename      VARCHAR2(20) := 'empfile.csv';
    v_emprec        VARCHAR2(120);
    v_count         INTEGER := 0;
BEGIN
    v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'r');
    LOOP
        UTL_FILE.GET_LINE(v_empfile,v_emprec);
        DBMS_OUTPUT.PUT_LINE(v_emprec);
        v_count := v_count + 1;
    END LOOP;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            UTL_FILE.FCLOSE(v_empfile);
            DBMS_OUTPUT.PUT_LINE('End of file ' || v_filename || ' - ' ||
                v_count || ' records retrieved');
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
            DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;

7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10
End of file empfile.csv - 14 records retrieved

IS_OPEN

IS_OPEN 関数は、指定されたファイルが開いているかどうかを判断します。

<status> BOOLEAN IS_OPEN(<file> FILE_TYPE)

Parameters

file

テストするファイルのファイルハンドルを含む FILE_TYPE タイプの変数。

status

指定されたファイルが開いている場合は TRUE 、開いていない場合は FALSE

NEW_LINE

NEW_LINE プロシージャは、ファイルに行末文字シーケンスを書き込みます。

NEW_LINE(<file> FILE_TYPE [, <lines> INTEGER ])

Parameters

file

行末文字シーケンスが書き込まれるファイルのファイルハンドルを含む FILE_TYPE タイプの変数。

lines

書き込まれる行末文字シーケンスの数。デフォルトは1です。

Examples

従業員レコードのダブルスペースリストを含むファイルが書き込まれます。

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_directory     VARCHAR2(50) := 'empdir';
    v_filename      VARCHAR2(20) := 'empfile.csv';
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
    v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
    FOR i IN emp_cur LOOP
        UTL_FILE.PUT(v_empfile,i.empno);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.ename);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.job);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.mgr);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.hiredate);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.sal);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.comm);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.deptno);
        UTL_FILE.NEW_LINE(v_empfile,2);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
    UTL_FILE.FCLOSE(v_empfile);
END;

Created file: empfile.csv

このファイルが表示されます:

C:\TEMP\EMPDIR>TYPE empfile.csv

7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20

7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30

7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30

7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20

7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30

7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30

7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10

7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20

7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10

7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30

7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20

7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30

7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20

7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10

PUT

PUT プロシージャは、指定されたファイルに文字列を書き込みます。文字列の末尾に行末文字シーケンスは書き込まれません。 NEW_LINE 手順を使用して、行末文字シーケンスを追加します。

PUT(<file> FILE_TYPE, <buffer> { DATE | NUMBER | TIMESTAMP |
  VARCHAR2 })

Parameters

file

指定された文字列が書き込まれるファイルのファイルハンドルを含む FILE_TYPE 型の変数。

buffer

指定されたファイルに書き込まれるテキスト。

Examples

次の例では、 PUT プロシージャを使用して、 emp テーブルから従業員のカンマ区切りファイルを作成します。

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_directory     VARCHAR2(50) := 'empdir';
    v_filename      VARCHAR2(20) := 'empfile.csv';
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
    v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
    FOR i IN emp_cur LOOP
        UTL_FILE.PUT(v_empfile,i.empno);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.ename);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.job);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.mgr);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.hiredate);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.sal);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.comm);
        UTL_FILE.PUT(v_empfile,',');
        UTL_FILE.PUT(v_empfile,i.deptno);
        UTL_FILE.NEW_LINE(v_empfile);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
    UTL_FILE.FCLOSE(v_empfile);
END;

Created file: empfile.csv

以下は、上記で作成された empfile.csv の内容です。

C:\TEMP\EMPDIR>TYPE empfile.csv

7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10

PUT_LINE

PUT_LINE プロシージャは、行末文字シーケンスを含む特定のファイルに単一行を書き込みます。

PUT_LINE(<file> FILE_TYPE,
  <buffer> {DATE|NUMBER|TIMESTAMP|VARCHAR2})

Parameters

file

指定された行が書き込まれるファイルのファイルハンドルを含む FILE_TYPE タイプの変数。

buffer

指定されたファイルに書き込まれるテキスト。

Examples

次の例では、 PUT_LINE プロシージャを使用して、 emp テーブルから従業員のカンマ区切りファイルを作成します。

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_directory     VARCHAR2(50) := 'empdir';
    v_filename      VARCHAR2(20) := 'empfile.csv';
    v_emprec        VARCHAR2(120);
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
    v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
    FOR i IN emp_cur LOOP
        v_emprec := i.empno || ',' || i.ename || ',' || i.job || ',' ||
            NVL(LTRIM(TO_CHAR(i.mgr,'9999')),'') || ',' || i.hiredate ||
            ',' || i.sal || ',' ||
            NVL(LTRIM(TO_CHAR(i.comm,'9990.99')),'') || ',' || i.deptno;
        UTL_FILE.PUT_LINE(v_empfile,v_emprec);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
    UTL_FILE.FCLOSE(v_empfile);
END;

以下は、上記で作成された empfile.csv の内容です。

C:\TEMP\EMPDIR>TYPE empfile.csv

7369,SMITH,CLERK,7902,17-DEC-80 00:00:00,800.00,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81 00:00:00,1600.00,300.00,30
7521,WARD,SALESMAN,7698,22-FEB-81 00:00:00,1250.00,500.00,30
7566,JONES,MANAGER,7839,02-APR-81 00:00:00,2975.00,,20
7654,MARTIN,SALESMAN,7698,28-SEP-81 00:00:00,1250.00,1400.00,30
7698,BLAKE,MANAGER,7839,01-MAY-81 00:00:00,2850.00,,30
7782,CLARK,MANAGER,7839,09-JUN-81 00:00:00,2450.00,,10
7788,SCOTT,ANALYST,7566,19-APR-87 00:00:00,3000.00,,20
7839,KING,PRESIDENT,,17-NOV-81 00:00:00,5000.00,,10
7844,TURNER,SALESMAN,7698,08-SEP-81 00:00:00,1500.00,0.00,30
7876,ADAMS,CLERK,7788,23-MAY-87 00:00:00,1100.00,,20
7900,JAMES,CLERK,7698,03-DEC-81 00:00:00,950.00,,30
7902,FORD,ANALYST,7566,03-DEC-81 00:00:00,3000.00,,20
7934,MILLER,CLERK,7782,23-JAN-82 00:00:00,1300.00,,10

PUTF

PUTF プロシージャは、指定されたファイルにフォーマットされた文字列を書き込みます。

PUTF(<file> FILE_TYPE, <format> VARCHAR2 [, <arg1> VARCHAR2]
  [, ...])

Parameters

file

フォーマットされた行が書き込まれるファイルのファイルハンドルを含む FILE_TYPE 型の変数。

format

ファイルに書き込まれるテキストをフォーマットする文字列。特殊文字シーケンス %s は、argの値に置き換えられます。特殊文字シーケンス /n は、改行を示します。ただし、AdvancedServerでは、改行文字を1つではなく2つの連続したバックスラッシュ( //n )で指定する必要があります。この特性は、Oracleデータベースと互換性がありません。

arg1

最大で5つの引数、 arg1 、.../ arg5%s が出現するたびにフォーマット文字列で置換されます。最初の引数は %s の最初の出現に置き換えられ、2番目の引数は %s の2番目の出現に置き換えられます。

Examples

次の匿名ブロックは、 emp テーブルのデータを含むフォーマットされた出力を生成します。Oracleデータベースと互換性のないフォーマット文字列の改行文字シーケンスには、Eリテラル構文と二重バックスラッシュを使用していることに注意してください。

DECLARE
    v_empfile       UTL_FILE.FILE_TYPE;
    v_directory     VARCHAR2(50) := 'empdir';
    v_filename      VARCHAR2(20) := 'empfile.csv';
    v_format        VARCHAR2(200);
    CURSOR emp_cur IS SELECT * FROM emp ORDER BY empno;
BEGIN
    v_format := E'%s %s, %s\\nSalary: $%s Commission: $%s\\n\\n';
    v_empfile := UTL_FILE.FOPEN(v_directory,v_filename,'w');
    FOR i IN emp_cur LOOP
        UTL_FILE.PUTF(v_empfile,v_format,i.empno,i.ename,i.job,i.sal,
            NVL(i.comm,0));
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('Created file: ' || v_filename);
    UTL_FILE.FCLOSE(v_empfile);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
        DBMS_OUTPUT.PUT_LINE('SQLCODE: ' || SQLCODE);
END;

Created file: empfile.csv

以下は、上記で作成された empfile.csv の内容です。

C:\TEMP\EMPDIR>TYPE empfile.csv
7369 SMITH, CLERK
Salary: $800.00 Commission: $0
7499 ALLEN, SALESMAN
Salary: $1600.00 Commission: $300.00
7521 WARD, SALESMAN
Salary: $1250.00 Commission: $500.00
7566 JONES, MANAGER
Salary: $2975.00 Commission: $0
7654 MARTIN, SALESMAN
Salary: $1250.00 Commission: $1400.00
7698 BLAKE, MANAGER
Salary: $2850.00 Commission: $0
7782 CLARK, MANAGER
Salary: $2450.00 Commission: $0
7788 SCOTT, ANALYST
Salary: $3000.00 Commission: $0
7839 KING, PRESIDENT
Salary: $5000.00 Commission: $0
7844 TURNER, SALESMAN
Salary: $1500.00 Commission: $0.00
7876 ADAMS, CLERK
Salary: $1100.00 Commission: $0
7900 JAMES, CLERK
Salary: $950.00 Commission: $0
7902 FORD, ANALYST
Salary: $3000.00 Commission: $0
7934 MILLER, CLERK
Salary: $1300.00 Commission: $0