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');
Symfoware Server
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/symfo', 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/symfo', 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/symfo')を確認します。
第1引数のディレクトリ・オブジェクト名(例の'DIR')を、2.で確認した実際のディレクトリ名(例の'/home/symfo')に置き換えます。
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/symfo')と第2引数(例のfname)のみ指定します。
UTL_FILE.FOPEN(第1引数, 第2引数, 第3引数, 第4引数)
CREATE DIRECTORY文を使用している場合(Oracle9.2i以降)、ディレクトリ名にディレクトリ・オブジェクト名を指定します。
ディレクトリ名にディレクトリ・オブジェクト名は指定できません。
以下の手順で移行してください。ディレクトリ・オブジェクト名と実際のディレクトリ名の対応の確認方法は、UTL_FILE_DIR/CREATE DIRECTORYを参照してください。
“UTL_FILE.FOPEN”というキーワードでストアドプロシジャ内を検索し、呼び出し箇所を特定します。
ディレクトリ・オブジェクト名(例の'DIR')に対応する実際のディレクトリ名(例の'/home/symfo')を確認します。
第1引数のディレクトリ・オブジェクト名(例の'DIR')を、1.で確認した実際のディレクトリ名(例の'/home/symfo')に置き換えます。
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を参照してください。