とっても ORACLE

ファイルI/Oを使うには


以下のサンプルのように inpfile を outfile にコピーできます。
CREATE OR REPLACE PROCEDURE FILE_IO IS
    FILE_I UTL_FILE.FILE_TYPE;
    FILE_O UTL_FILE.FILE_TYPE;
    W_DATA VARCHAR2(1000);
BEGIN
    FILE_I := UTL_FILE.FOPEN('C:\temp','inpfile.txt','R');
    FILE_O := UTL_FILE.FOPEN('C:\temp','outfile.txt','W');
    LOOP
        BEGIN
            UTL_FILE.GET_LINE(FILE_I,W_DATA);
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
            UTL_FILE.FCLOSE_ALL;
            EXIT;
        END;
        UTL_FILE.PUT_LINE(FILE_O,W_DATA);
    END LOOP;
EXCEPTION
    WHEN UTL_FILE.INVALID_PATH THEN
        DBMS_OUTPUT.PUT_LINE('INVALID_PATH');
        UTL_FILE.FCLOSE_ALL;
    WHEN UTL_FILE.INVALID_MODE THEN
        DBMS_OUTPUT.PUT_LINE('INVALID_MODE');
        UTL_FILE.FCLOSE_ALL;
    WHEN UTL_FILE.INVALID_FILEHANDLE THEN
        DBMS_OUTPUT.PUT_LINE('INVALID_FILEHANDLE');
        UTL_FILE.FCLOSE_ALL;
    WHEN UTL_FILE.INVALID_OPERATION THEN
        DBMS_OUTPUT.PUT_LINE('INVALID_OPERATION');
        UTL_FILE.FCLOSE_ALL;
    WHEN UTL_FILE.WRITE_ERROR THEN
        DBMS_OUTPUT.PUT_LINE('WRITE_ERROR');
        UTL_FILE.FCLOSE_ALL;
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('SQLCODE');
        DBMS_OUTPUT.PUT_LINE('SQLERRM');
        UTL_FILE.FCLOSE_ALL;
END;
/
ただしinitSID.oraに
utl_file_dir = c:\temp
のようにファイルのパスの記述が必要です。
また、utl_file_dir には、ワイルドカードが使用できます。
utl_file_dir = *
複数ディレクトリを指定する場合は、カンマで区切ります。

初期化パラメータを追加したらデータベースの再起動をします。
SELECT * FROM v$parameter WHERE name = 'utl_file_dir';
で確認する。

PL/SQLファイルI/Oは、クライアント側およびサーバー側の両方で使用できます。ただし、サーバー側でのファイル・アクセスは、アクセス可能なディレクトリ・リストに明示的にリストされたディレクトリだけに制限されています。このリストはOracle初期化ファイルに格納されています。
(マニュアル「PL/SQL ユーザーズ・ガイドおよびリファレンス、リリース8.0/パッケージ/製品固有のパッケージ/UTL_FILE」より)
*とした場合でも、ネットワークドライブを指定した場合、エラーになるのはサービスがシステムアカウントで起動されているからです。ネットワークの資源を参照するためのアクセス権が必要です。
オライリージャパンの「オラクルPL/SQLプログラミング」ではそれぞれ下記のようになっているようですが、間違っているようです。
  dmlsql_file := UTL_FILE.FOPEN('C:\TEMP\','dmlsql.sql', 'A');
    
    UTI_FILE_DIR = 'C:\TEMP'


ただし1行の長さに1023bytesという制限があります。Oracle8 R8.0.5 からは fopen の 4番目の引数にline size を記述すれば32,767 バイトまで出力可能になります。


オラクル Oracle 購入オラクル製品のお見積りご購入はこちら
ユーザー登録すると、オンライン特別割引価格で見積できます。


Copyright(c) 1999-2018 ITNAVI.com サイト運営者情報