SET FEEDBACK OFF
SET ECHO OFF
SET SERVEROUTPUT ON
SET TRIMSPOOL ON
SET LINESIZE 1024
SPOOL .\logfile.log

DECLARE
----------------------------------------
-- 変数定義
----------------------------------------
-- 定数その他宣言
DIR_PATH        CONSTANT VARCHAR2(50) := 'C:\TEST';
FILE_PARA       CONSTANT VARCHAR2(50) := 'file.txt';

-- File関連
P_RFILE         UTL_FILE.FILE.TYPE;             --ファイルポインタ読み込み用ポインタ
P_WFILE         UTL_FILE.FILE.TYPE;             --ファイルポインタ書き込み用ポインタ
sReadLine   VARCHAR2(1024);                     -- 読み込みファイル格納用

-- 検出データ格納領域
wk_ITEM1    VARCHAR2(512);
wk_ITEM2    VARCHAR2(512);
wk_ITEM3    VARCHAR2(512);
wk_ITEM4    VARCHAR2(512);
wk_ITEM5    VARCHAR2(512);

-- 異常ログ用バッファ
ERR_MESSAGE     VARCHAR2(100);

-- ユーザ定義例外
UDEF_PARA_ERROR EXCEPTION;

----------------------------------------
-- カーソル定義
----------------------------------------
CURSOR
        XXX_CURSOR
        (
                CSR_COLUMN1     CHAR
                CSR_COLUMN2 CHAR
        )
IS
        SELECT
                FIELD1,                 --CHAR(10) NOT NULL --(P) 項目名
                FIELD2,
                FIELD3
        FROM
                TABLE NAME
        WHERE
                CSR_COLUMN1 = FIELD1
        AND 
                CSR_COLUMN2 = FIELD2
;

-- カーソルから値を取得するバッファ
XXX_CURSOR_GETDATA XXX_CURSOR%ROWTYPE;

----------------------------------------
-- ロジック
----------------------------------------
BEGIN
        --DBMS_OUTPUTパッケージのMAXサイズを設定
        DBMS_OUTPUT.ENABLE(1000000);
        
        --入力パラメータファイルのOPEN
        ERR_MESSAGE := '';
        ERR_MESSAGE := '入力パラメータファイルのOPEN';
        P_RFILE := UTL_FILE.FOPEN(DIR_PATH, FILE_PARA, 'R');
        
        -- ファイルよりパラメータ取得
        LOOP
                -- 一行読み込み
                BEGIN
                        UTL_FILE.GET_LINE(P_RFILE, sReadLine);
                EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                                --処理を抜ける
                                EXIT;
                END;
                
        END LOOP;
        
        -- 更新用情報ファイルを開く
        P_WFILE := UTL_FILE.FOPEN(DIR_PATH, FILE_PARA, 'W');
        
        
----------------------------------------
-- データ取得
----------------------------------------
        
        -- カーソルオープン
        OPEN XXX_CURSOR
        (
                PARA_DATA1,
                PARA_DATA2
        );
        -- ループ開始
        LOOP
        
                XXX_CURSOR_GETDATA.FIELD1 := NULL;
                XXX_CURSOR_GETDATA.FIELD2 := NULL;
                
                -- フェッチ開始
                FETCH
                        XXX_CURSOR
                INTO
                        XXX_CURSOR_GETDATA
                ;
                
                -- NOTFOUNDが検出された時はループを抜ける
                EXIT WHEN XXX_CURSOR%NOTFOUND;
                
                wk_ITEM1 := RTRIM(XXX_CURSOR_GETDATA.FIELD1);
                wk_ITEM2 := RTRIM(XXX_CURSOR_GETDATA.FIELD2);
                
                -- 書き込みファイルオープン
                IF UTL_FILE.IS_OPEN(P_WFILE) THEN
                        ------------------------------------
                        -- 取得したデータをCSVファイルに出力
                        ------------------------------------
                        UTL_FILE.PUT_LINE
                        (P_WFILE,
                        wk_ITEM1 ||','||
                        wk_ITEM2 ||','||
                        wk_ITEM3
                        );
                END IF;
        END LOOP;
        
        -- カーソルをクローズ
        IF XXX_CURSOR%ISOPEN THEN
                CLOSE XXX_CURSOR;
        END IF;
        
EXCEPTION
        /* その他 */
        WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('#### 異常終了 ####');
                DBMS_OUTPUT.PUT_LINE('CODE' || SQLCODE);
                DBMS_OUTPUT.PUT_LINE('MSG' || SQLERRM);
                -- カーソルをクローズ
                IF XXX_CURSOR%ISOPEN THEN
                        CLOSE XXX_CURSOR;
                END IF;
                
                UTL_FILE.FCLOSE_ALL;
END;
/
SET TRIMSPOOL OFF
SET SERVEROUTPUT OFF
SPOOL OFF

EXIT;

最終更新:2008年11月16日 11:27