ページの先頭行へ戻る
Enterprise Postgres 10 アプリケーション開発ガイド
FUJITSU Software

B.6.2 ファイルの情報を確認したい

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');

(2) FGETATTR
Oracleデータベースにおける記述形式

UTL_FILE.FGETATTR(第1引数, 第2引数, 第3引数, 第4引数, 第5引数)

機能差異
Oracleデータベース

CREATE DIRECTORY文を使用している場合(Oracle9.2i以降)、ディレクトリ名にディレクトリ・オブジェクト名を指定します。

FUJITSU Enterprise Postgres

ディレクトリ名にディレクトリ・オブジェクト名は指定できません。

記述差異
Oracleデータベース

取得する値は、引数に指定した変数で受け取ります。

FUJITSU Enterprise Postgres

取得する値は、UTL_FILE.FGETATTRの検索結果なので、SELECT文のINTO句に指定した変数で受け取ります。

移行手順

以下の手順で移行してください。ディレクトリ・オブジェクト名と実際のディレクトリ名の対応の確認方法は、UTL_FILE_DIR/CREATE DIRECTORYを参照してください。

  1. “UTL_FILE.FOPEN”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。

  2. ディレクトリ・オブジェクト名(例の'DIR')に対応する実際のディレクトリ名(例の'/home/fsep')を確認します。

  3. 第1引数のディレクトリ・オブジェクト名(例の'DIR')を、2.で確認した実際のディレクトリ名(例の'/home/fsep')に置き換えます。

  4. 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)のみ指定します。


(3) FOPEN
Oracleにおける記述形式

UTL_FILE.FOPEN(第1引数, 第2引数, 第3引数, 第4引数)

機能差異
Oracleデータベース

CREATE DIRECTORY文を使用している場合(Oracle9.2i以降)、ディレクトリ名にディレクトリ・オブジェクト名を指定します。

FUJITSU Enterprise Postgres

ディレクトリ名にディレクトリ・オブジェクト名は指定できません。

移行手順

以下の手順で移行してください。ディレクトリ・オブジェクト名と実際のディレクトリ名の対応の確認方法は、UTL_FILE_DIR/CREATE DIRECTORYを参照してください。

  1. “UTL_FILE.FOPEN”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。

  2. ディレクトリ・オブジェクト名(例の'DIR')に対応する実際のディレクトリ名(例の'/home/fsep')を確認します。

  3. 第1引数のディレクトリ・オブジェクト名(例の'DIR')を、1.で確認した実際のディレクトリ名(例の'/home/fsep')に置き換えます。


(4) GET_LINE
Oracleデータベースにおける記述形式

UTL_FILE.GET_LINE(第1引数, 第2引数, 第3引数)

記述差異
Oracleデータベース

取得する値は、引数に指定した変数で受け取ります。

FUJITSU Enterprise Postgres

取得する値は、UTL_FILE.GET_LINEの復帰値なので、代入文に指定した変数で受け取ります。

移行手順

以下の手順で移行してください。

  1. “UTL_FILE.GET_LINE”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。

  2. UTL_FILE.GET_LINEの呼び出し箇所を、値の代入(:=)に置き換えてください。

    • 左辺にUTL_FILE.GET_LINEに指定していた第2引数(例のv_rbuff)を指定します。

    • 右辺にUTL_FILE.GET_LINEを記載します。引数は修正前の第1引数(例のv_file)と第3引数(例の1024)のみ指定します。


(5) FCLOSE
Oracleデータベースにおける記述形式

UTL_FILE.FCLOSE(第1引数)

記述差異
Oracleデータベース

クローズすると、引数に指定したファイルハンドラがNULL値になります。

FUJITSU Enterprise Postgres

クローズすると、UTL_FILE.FCLOSEの復帰値がNULL値になりますので、代入文に指定したファイルハンドラで受け取ります。

移行手順

以下の手順で移行してください。

  1. “UTL_FILE.FCLOSE”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。

  2. UTL_FILE.FCLOSEの呼び出し箇所を、値の代入(:=)に置き換え、ファイルハンドラ(例のv_file)がNULL値となるようにします。

    • 左辺にUTL_FILE.FCLOSEに指定していた引数(例のv_file)を指定します。

    • 右辺にUTL_FILE.FCLOSEを記載します。引数は修正前と同じ値(例のv_file)を指定します。


(6) FCLOSE_ALL

DBMS_OUTPUTパッケージのNEW_LINEと同じです。記述差異および、記述差異に伴う移行手順については、DBMS_OUTPUTパッケージのNEW_LINEを参照してください。