ORACLE pt.5 【PL/SQL のプロシージャ 備忘記録 - 外部ファイル操作】


プロシージャの書き方の備忘記録として
また、外部ファイルの扱い(UTL_FILE)についても

CREATE OR REPLACE PROCEDURE DBHOGEHOGE.PRC_PK (
--***********************************************
--  タイプ : プロシジャ
--***********************************************
  p_filename    IN  VARCHAR2       -- ファイル名
)
IS
  --定数
  UserId                CONSTANT VARCHAR2(40) := '9999';            -- 登録者ID
  ExtCSV                CONSTANT CHAR(4)      := '.csv';            -- CSVファイル拡張子

  --変数
  v_kytnid              NUMBER;                                     -- 拠点ID
  v_filename            VARCHAR2(128);                              -- ファイル名

  w_path_inp            VARCHAR2(100);                              -- 取込フォルダ
  w_path_bak            VARCHAR2(100);                              -- 退避フォルダ
  w_bk_filename         VARCHAR2(100);                              -- 退避用ファイル名
  w_found               BOOLEAN;                                    -- ファイル存在あり
  w_size                NUMBER;
  w_block               NUMBER;
  w_handle              UTL_FILE.FILE_TYPE;                         -- ハンドル
  w_read                VARCHAR2(512);                              -- 読み取りバッファ
  w_cnt                 NUMBER;                                     -- 行番号

BEGIN
  --******************************************
  --        初期処理
  --******************************************

  -- 引数を変数へ格納
  v_filename  := p_filename;    -- ファイル名

  -- システム日付
  w_sys_date  := TO_NUMBER(TO_CHAR(SYSDATE,'yyyymmdd'));

  --******************************************
  --     ファイルの存在確認
  --******************************************

  -- フォルダ情報を取得
  SELECT DIR, BAK INTO w_path_inp, w_path_bak
    FROM M_FILES;

  -- CSVファイルのチェック
  UTL_FILE.FGETATTR(w_path_inp, v_filename || ExtCSV, w_found, w_size, w_block);

  -- 存在していない場合
  IF w_found = FALSE THEN
    -- 処理終了
    RETURN;
  END IF;

  -- 退避用ファイル名生成
  w_bk_filename := v_filename || FileNameSep || v_kytnid || FileNameSep || v_targetday || FileNameSep || v_targetbin;

  --******************************************
  --      受信処理
  --******************************************
  w_handle := UTL_FILE.FOPEN(w_path_inp, v_filename || ExtCSV, 'r');
  w_cnt := 0;

  LOOP
    BEGIN
      UTL_FILE.GET_LINE(w_handle, w_read);

      w_cnt := w_cnt + 1;

      -- 受信ファイル
      INSERT INTO T_JYUSIN (
        FNAME,                -- ファイル名
        FGYONO,               -- 行番号
        FDATA,                -- ファイルデータ
        INSDT,                -- 登録日
      ) VALUES (
        v_filename,           -- 引数.ファイル名
        w_cnt,                -- ファイルの行番号
        w_read,               -- 1行の生データ
        w_sys_date            -- 登録日
      );

    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        --ファイルの終端に来た場合は、ループ終了
        EXIT;
    END;

  END LOOP;

  --******************************************
  --      退避フォルダファイルコピー
  --******************************************

  -- CSVファイル
  UTL_FILE.FCOPY(w_path_inp, v_filename || ExtCSV, w_path_bak, w_bk_filename || ExtCSV);

  --******************************************
  --      受信ファイル削除
  --******************************************

  -- CSVファイル
  UTL_FILE.FREMOVE(w_path_inp, v_filename || ExtCSV);

  --******************************************
  --      正常終了
  --******************************************/

EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END PRC_PK
/