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
パッケージで使用可能な手順と機能を次の表に示します。
機能/手順 |
戻りタイプ |
説明 |
|
該当なし |
|
|
該当なし |
開いているファイルをすべて閉じます。 |
|
該当なし |
|
|
該当なし |
バッファ内のデータを |
|
|
|
|
該当なし |
指定したファイルをファイルシステムから削除します。 |
|
該当なし |
指定されたファイルの名前を変更します。 |
|
該当なし |
|
|
|
指定されたファイルが開いているかどうかを決定します。 |
|
該当なし |
行末文字シーケンスをファイルに書き込みます。 |
|
該当なし |
指定されたファイルに |
|
該当なし |
指定されたファイルに |
|
該当なし |
指定されたファイルにフォーマットされた文字列を書き込みます。最大5つの置換パラメーター、 |
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
psql
で CREATE 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_dir
のdest_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