Oracleデータベース
CREATE PROCEDURE read_file(fname VARCHAR2) AS
    v_file      UTL_FILE.FILE_TYPE;
    v_exists    BOOLEAN;
    v_length    NUMBER;
    v_bsize     INTEGER;
    v_rbuff     VARCHAR2(1024);
BEGIN
    UTL_FILE.FGETATTR('DIR', fname, v_exists, v_length, v_bsize);・・・(2)
    IF v_exists <> true THEN
        DBMS_OUTPUT.PUT_LINE('-- FILE NOT FOUND --');
        RETURN;
    END IF;
    DBMS_OUTPUT.PUT_LINE('-- FILE DATA --');
    v_file := UTL_FILE.FOPEN('DIR', fname, 'r', 1024);・・・(3)
    FOR i IN 1..3 LOOP
        UTL_FILE.GET_LINE(v_file, v_rbuff, 1024);・・・(4)
        DBMS_OUTPUT.PUT_LINE(v_rbuff);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('... more');
    DBMS_OUTPUT.PUT_LINE('-- READ END --');
    UTL_FILE.FCLOSE(v_file);・・・(5)
    RETURN;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('-- FILE END --');
        UTL_FILE.FCLOSE(v_file); 
        RETURN;
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('-- SQL Error --');
        DBMS_OUTPUT.PUT_LINE('ERROR : ' || SQLERRM );
        UTL_FILE.FCLOSE_ALL;・・・(6)
        RETURN;
END;
/
set serveroutput on
call read_file('file01.txt');Fujitsu Enterprise Postgres
CREATE FUNCTION read_file(fname VARCHAR) RETURNS void AS $$
DECLARE
    v_file      UTL_FILE.FILE_TYPE;
    v_exists    BOOLEAN;
    v_length    NUMERIC;
    v_bsize     INTEGER;
    v_rbuff     VARCHAR(1024);
BEGIN
    PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE);
    SELECT fexists, file_length, blocksize
       INTO v_exists, v_length, v_bsize
       FROM UTL_FILE.FGETATTR('/home/fsep', fname);・・・(2)
    IF v_exists <> true THEN
        PERFORM DBMS_OUTPUT.PUT_LINE('-- FILE NOT FOUND --');
        RETURN;
    END IF;
    PERFORM DBMS_OUTPUT.PUT_LINE('-- FILE DATA --');
    v_file := UTL_FILE.FOPEN('/home/fsep', fname, 'w', 1024);・・・(3)
    FOR i IN 1..3 LOOP
        v_rbuff := UTL_FILE.GET_LINE(v_file, 1024);・・・(4)
        PERFORM DBMS_OUTPUT.PUT_LINE(v_rbuff);
    END LOOP;
    PERFORM DBMS_OUTPUT.PUT_LINE('... more');
    PERFORM DBMS_OUTPUT.PUT_LINE('-- READ END --');
    v_file := UTL_FILE.FCLOSE(v_file);・・・(5)
    RETURN;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        PERFORM DBMS_OUTPUT.PUT_LINE('-- FILE END --');
        v_file := UTL_FILE.FCLOSE(v_file);
        RETURN;
    WHEN OTHERS THEN
        PERFORM DBMS_OUTPUT.PUT_LINE('-- SQL Error --');
        PERFORM DBMS_OUTPUT.PUT_LINE('ERROR : ' || SQLERRM );
        PERFORM UTL_FILE.FCLOSE_ALL();・・・(6)
        RETURN;
END;
$$ 
LANGUAGE plpgsql;
SELECT read_file('file01.txt');UTL_FILE.FGETATTR(第1引数, 第2引数, 第3引数, 第4引数, 第5引数)
CREATE DIRECTORY文を使用している場合(Oracle9.2i以降)、ディレクトリ名にディレクトリ・オブジェクト名を指定します。
ディレクトリ名にディレクトリ・オブジェクト名は指定できません。
取得する値は、引数に指定した変数で受け取ります。
取得する値は、UTL_FILE.FGETATTRの検索結果なので、SELECT文のINTO句に指定した変数で受け取ります。
以下の手順で移行してください。ディレクトリ・オブジェクト名と実際のディレクトリ名の対応の確認方法は、UTL_FILE_DIR/CREATE DIRECTORYを参照してください。
“UTL_FILE.FOPEN”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。
ディレクトリ・オブジェクト名(例の'DIR')に対応する実際のディレクトリ名(例の'/home/fsep')を確認します。
第1引数のディレクトリ・オブジェクト名(例の'DIR')を、2.で確認した実際のディレクトリ名(例の'/home/fsep')に置き換えます。
UTL_FILE.FGETATTRの呼び出し箇所を、SELECT INTO文に置き換えます。
選択リストに、fexists, file_length, blocksizeと記載します。
INTO句に、UTL_FILE.FGETATTRに設定していた第3引数~第5引数(例のv_exists, v_length, v_bsize)を引数と同じ順番で記載します。
FROM句にUTL_FILE.FGETATTRを記載します。引数は修正前の第1引数の実際のディレクトリ名(例の'/home/fsep')と第2引数(例のfname)のみ指定します。
UTL_FILE.FOPEN(第1引数, 第2引数, 第3引数, 第4引数)
CREATE DIRECTORY文を使用している場合(Oracle9.2i以降)、ディレクトリ名にディレクトリ・オブジェクト名を指定します。
ディレクトリ名にディレクトリ・オブジェクト名は指定できません。
以下の手順で移行してください。ディレクトリ・オブジェクト名と実際のディレクトリ名の対応の確認方法は、UTL_FILE_DIR/CREATE DIRECTORYを参照してください。
“UTL_FILE.FOPEN”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。
ディレクトリ・オブジェクト名(例の'DIR')に対応する実際のディレクトリ名(例の'/home/fsep')を確認します。
第1引数のディレクトリ・オブジェクト名(例の'DIR')を、1.で確認した実際のディレクトリ名(例の'/home/fsep')に置き換えます。
UTL_FILE.GET_LINE(第1引数, 第2引数, 第3引数)
取得する値は、引数に指定した変数で受け取ります。
取得する値は、UTL_FILE.GET_LINEの復帰値なので、代入文に指定した変数で受け取ります。
以下の手順で移行してください。
“UTL_FILE.GET_LINE”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。
UTL_FILE.GET_LINEの呼び出し箇所を、値の代入(:=)に置き換えてください。
左辺にUTL_FILE.GET_LINEに指定していた第2引数(例のv_rbuff)を指定します。
右辺にUTL_FILE.GET_LINEを記載します。引数は修正前の第1引数(例のv_file)と第3引数(例の1024)のみ指定します。
UTL_FILE.FCLOSE(第1引数)
クローズすると、引数に指定したファイルハンドラがNULL値になります。
クローズすると、UTL_FILE.FCLOSEの復帰値がNULL値になりますので、代入文に指定したファイルハンドラで受け取ります。
以下の手順で移行してください。
“UTL_FILE.FCLOSE”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。
UTL_FILE.FCLOSEの呼び出し箇所を、値の代入(:=)に置き換え、ファイルハンドラ(例のv_file)がNULL値となるようにします。
左辺にUTL_FILE.FCLOSEに指定していた引数(例のv_file)を指定します。
右辺にUTL_FILE.FCLOSEを記載します。引数は修正前と同じ値(例のv_file)を指定します。
DBMS_OUTPUTパッケージのNEW_LINEと同じです。記述差異および、記述差異に伴う移行手順については、DBMS_OUTPUTパッケージのNEW_LINEを参照してください。