Oracle の PL/SQL ロジック内で直接テキストファイルからの読み込みやテキストファイルへの出力をしたいときがあります。
その方法について記載します。
【事前準備】
テキストファイルを入出力する際には事前に許可するディレクトリを設定しておく必要があります。
まず、初期化パラメータにそのディレクトリのパスを設定します。
- Oracle Enterprise Manager を起動し、SYSDBA 権限でログインします。
「サーバー」タブを選択し、「初期化パラメータ」リンクをクリックします。
クリックで拡大
- このサーバーは spfile で構成されているので画面上部の「SPFile」リンクをクリックします。
クリックで拡大
- SPFileの一覧が表示されます。
クリックで拡大
- SPFile の一覧で一番最後までスクロールすると、下から3番目に「util_file_dir」という項目があります。
この欄に入出力を許可するディレクトリパスを登録します。( *と登録するとどこでも可になります)
登録したら「適用」ボタンをクリックし、サーバーを再起動します。
クリックで拡大
【コマンドで実行する場合】
上記の設定を ALTER コマンドで実行することもできます。
SQL*Plus を起動し、SYSDBA 権限を持ったユーザーで接続します。
ALTER SYSTEM SET UTL_FILE_DIR='D:\WORK','D:\TEMP' SCOPE = SPFILE ;
クリックで拡大
ディレクトリ指定の最後に「\」は必要ありません。
複数のディレクトリを指定する場合は「,」カンマ区切りで指定します。
すべてのディレクトリを許可する場合は「*」で指定することもできますが、セキュリティ的には非常に危険な設定です。テスト環境のみにしましょう。
【設定されている内容を確認する】
UTILFILE_DIR の設定内容を確認します。
SHOW PARAMETER UTIL_FILE_DIR
クリックで拡大
【UTL_FILE を実行する権限を付与する】
Oracle Database Exceprss Edition (無償版)を使用している場合にはデフォルトで UTL_FILE の実行権限がありません。
SYSTEM ユーザーでログインし、UTL_FILE を実行する権限を付与します。
GRANT EXECUTE ON UTL_FILE TO <ユーザー名>;
全ユーザーに権限を付与する場合はユーザー名に「public」と指定できます。
【PL/SQL でテキストファイルへ書き込みを行う】
PL/SQL でテキストファイルの操作を行うには UTL_FILE を使用します。
CREATE OR REPLACE PROCEDURE FILE WRITE
AS
T_HANDLE UTL_FILE.FILE_TYPE;
BEGIN
-- ファイルを書き込みモードで開く
T_HANDLE := UTL_FILE.FOPEN('D:\WORK' ,'LOG.txt','w', 32767);
--ファイルに文字列を出力(行の最後に改行コードを付加)
UTL_FILE.PUT_LINE(T_HANDLE, 'サンプル出力');
--ファイルに文字列を出力(行の最後に改行コードを付加しない)
UTL_FILE.PUT(T_HANDLE, 'サンプル出力');
--ファイルを閉じる
UTL_FILE.FCLOSE(T_HANDLE);
EXCEPTION WHEN OTHERS THEN
--ファイルをすべて閉じる
UTL_FILE.FCLOSE_ALL;
RAISE;
END;
【PL/SQL でテキストファイルから読み込みを行う】
CREATE OR REPLACE PROCEDURE FILE__READ
AS
T_HANDLE UTL_FILE.FILE_TYPE;
V_DATA VARCHAR2(32767);
BEGIN
-- ファイルを読み込みモードで開く
T_HANDLE := UTL_FILE.FOPEN('D:\WORK' ,'LOG.txt','r', 32767);
BEGIN
LOOP
--1行データを読み込む
UTL_FILE.GET_LINE(T_HANDLE, V_DATA,32767);
--表示する
DBMS_OUTPUT.PUT_LINE(V_DATA);
END LOOP;
EXCEPTION WHEN NO_DATA_FOUND THEN
--ファイルの最後を検出
DBMS_OUTPUT.PUT_LINE('EOF');
END;
--ファイルを閉じる
UTL_FILE.FCLOSE(T_HANDLE);
EXCEPTION WHEN OTHERS THEN
--ファイルをすべて閉じる
UTL_FILE.FCLOSE_ALL;
RAISE;
END;
【参考情報】