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を参照してください。