UTL_FILE.FOPEN
読み込み
[事前作業]
対象ファイルにアクセスする為、権限を付与する必要
SQL> show user ユーザーは"SYS"です。 SQL> create or replace directory utl_data as '/tmp'; ディレクトリが作成されました。 SQL> col directory_path for a20 SQL> select directory_path from all_directories where directory_name = 'UTL_DATA'; DIRECTORY_PATH -------------------- /tmp ※'/tmp'が追加されていること ※オブジェクト名はプログラムで使う名前になる SQL> grant read,write on directory utl_data to scott; 権限付与が成功しました。 SQL> !cat /tmp/test.txt ※ファイルが作成されていること hoge foo bar
[実行]
SQL> show user ユーザーは"SCOTT"です。 SQL> declare dir_name varchar2(30); file_name varchar2(20); fh utl_file.file_type; read_line varchar2(1024); begin dir_name := 'UTL_DATA'; ※OSから見えるディレクトリ名ではなく、事前に作成したオブジェクト名を指定 file_name := 'test.txt'; fh := utl_file.fopen(dir_name, file_name, 'r'); begin loop utl_file.get_line(fh, read_line); ※1行づつファイル読み取り dbms_output.put_line(read_line); ※読み取った値を表示 end loop; exception when no_data_found then null; end; utl_file.fclose(fh); end; / hoge foo bar PL/SQLプロシージャが正常に完了しました。
書き込み
declare dir_name varchar2(30); file_name varchar2(20); fh utl_file.file_type; cursor c_emp is select ename,sal from emp; begin dir_name := 'UTL_DATA'; file_name := 'result.txt'; fh := utl_file.fopen(dir_name, file_name, 'w'); for r_emp in c_emp loop utl_file.put_line(fh, r_emp.ename || ',' || r_emp.sal); end loop; utl_file.fclose(fh); end; / SQL> !cat /tmp/result.txt hoge,500 SMITH,800 JONES,2945 CLARK,2450 KING,5000 FORD,3000 MILLER,1300 PL/SQLプロシージャが正常に完了しました。
書き込み(PUTF)
所謂、PRINTF
SQL> declare dir_name varchar2(30); file_name varchar2(20); fh utl_file.file_type; cursor c_emp is select ename,sal from emp; begin dir_name := 'UTL_DATA'; file_name := 'result.txt'; fh := utl_file.fopen(dir_name, file_name, 'w'); for r_emp in c_emp loop utl_file.putf(fh, '%sさんの給与: %s\n', r_emp.ename, r_emp.sal); end loop; utl_file.fclose(fh); end; / SQL> !cat /tmp/result.txt hogeさんの給与: 500 SMITHさんの給与: 800 JONESさんの給与: 2945 CLARKさんの給与: 2450 KINGさんの給与: 5000 FORDさんの給与: 3000 MILLERさんの給与: 1300 PL/SQLプロシージャが正常に完了しました。
UTL_FILEで出力される例外
例外 | 説明 |
INVALID_PATH | 不正なパス指定 |
INVALID_MODE | FOPENの指定モードの誤り |
INVALID_FILEHANDLE | ファイルハンドラが存在しない |
INVALID_OPERATION | ファイル操作が正常に実行できない |
READ_ERROR | 読み取り中にエラー |
WRITE_ERROR | 書き込み中にエラー |
INTERNAL_ERROR | 予期せぬエラー |