03

【オラクル】UTL_FILE パッケージを使ってファイル書込み

9月

/* 実行環境 ========================================
 Oracle Database 11g Release 11.2.0.1.0
===================================================*/

/*==================================================
あらかじめディレクトリオブジェクトを作成しておく
(オラクルの再起動不要)
注)CREATE DIRECTORY は9i以降で使用可能

[例]
CREATE OR REPLACE DIRECTORY OUTDATA_DIR AS ‘/opt/app/oracle/product/11.2.0/dbhome_1/rdbms/log/’;
GRANT WRITE ON DIRECTORY OUTDATA_DIR TO PUBLIC;

=== ディレクトリに設定したパス、権限を調べるには ===
select b.directory_name,b.directory_path,
a.grantee,a.privilege
from dba_tab_privs a,dba_directories b
where a.table_name = b.directory_name;

===================================================*/

—-仕様部—–
 CURSOR cGet_ResultCalcStock IS
   SELECT
     FIELD_1
    ,FIELD_2
   FROM
     TABLE_A
   ;

 TYPE tGet_ResultCalcStock IS TABLE OF cGet_ResultCalcStock%ROWTYPE INDEX BY BINARY_INTEGER;
 rGet_ResultCalcStock tGet_ResultCalcStock;
—-body——-
FUNCTION OutData_ResultCalc(nRtnSQLCODE OUT NUMBER, vRtnSQLERRM OUT VARCHAR2)

 RETURN BOOLEAN IS

  out_handle UTL_FILE.FILE_TYPE;
  buf           VARCHAR2(1023);
  nCNT          NUMBER(10,0);
  vFileName     VARCHAR2(1023);
  sResult_Path  CONSTANT VARCHAR2(200) := ‘OUTDATA_DIR’;   /* 処理結果ファイル出力パス */
 
 BEGIN

   — 書き込みモードでファイルオープン
   vFileName := ‘outdata.csv’;
  
   –’r':読込み
   –’w':書込み
   –’a':追加書込み
   out_handle := UTL_FILE.FOPEN(sResult_Path, vFileName ,’w');

   OPEN cGet_ResultCalcStock;
   LOOP
     FETCH cGet_ResultCalcStock BULK COLLECT INTO rGet_ResultCalcStock;
     EXIT WHEN rGet_ResultCalcStock.COUNT = 0;

     FOR i in 1 .. rGet_ResultCalcStock.COUNT
     LOOP

       buf := rGet_ResultCalcStock(i).FIELD_1 || ‘,’ || rGet_ResultCalcStock(i).FIELD_2;
       — 1レコードファイルに書き込み
       UTL_FILE.put_line(out_handle,buf);

     END LOOP;
   END LOOP;
  
   CLOSE cGet_ResultCalcStock;

   — ファイルクローズ
   UTL_FILE.FCLOSE(out_handle);

   RETURN TRUE;

 EXCEPTION
   WHEN OTHERS THEN
     /* エラー情報取得 */
     nRtnSQLCODE := SQLCODE;
     vRtnSQLERRM := SQLERRM;
     RETURN FALSE;
END OutData_ResultCalc;

continue reading...

Leave a Reply