単純な呼び出し先として、入力引数を二つ取るプロシージャです。
1) SQL としての呼び出し
CALL CSV_OUT('0006','0007')
2) 最も単純な PL/SQL ブロックとしての呼び出し
begin CSV_OUT('0006','0007'); end;
3) 一時 PL/SQL の一部として呼び出し
DECLARE
WK_FROM VARCHAR2(4) := '0005';
WK_TO VARCHAR2(4) := '0015';
BEGIN
CSV_OUT(WK_FROM,WK_TO);
END;
CREATE or REPLACE PROCEDURE CSV_OUT
(
PM_STRING1 IN VARCHAR2
,PM_STRING2 IN VARCHAR2
)
/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
WK_FILENAME VARCHAR2(100);
WK_CHARACTERSET VARCHAR2(100);
FILEHANDLE UTL_FILE.FILE_TYPE;
CURSOR cur_main IS
SELECT * FROM 社員マスタ
where 社員コード
between PM_STRING1 and PM_STRING2
order by フリガナ;
COMMENT_REC cur_main%ROWTYPE;
/**********************************************************/
/* 内部プロシージャ( データ出力 ) */
/**********************************************************/
PROCEDURE WRITE_DATA
AS
WK_CSV VARCHAR2(200);
BEGIN
/***********************************************/
/* 1行ぶんのデータの作成 */
/***********************************************/
WK_CSV := COMMENT_REC.社員コード;
WK_CSV := WK_CSV || ',' || COMMENT_REC.氏名;
/***********************************************/
/* AL32UTF8 は、10g Express 対応 */
/***********************************************/
if WK_CHARACTERSET = 'AL32UTF8' then
UTL_FILE.PUT_LINE(
FILEHANDLE,
CONVERT( WK_CSV,'JA16SJIS','AL32UTF8')
);
else
UTL_FILE.PUTF( FILEHANDLE, '%s\n', WK_CSV );
end if;
END;
/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
DBMS_OUTPUT.PUT_LINE('デバッグ:開始');
/***********************************************/
/* 行データを変数にセット */
/***********************************************/
SELECT VALUE INTO WK_CHARACTERSET from V$NLS_PARAMETERS
where PARAMETER = 'NLS_CHARACTERSET';
/***********************************************/
/* 出力ファイル名を設定 */
/***********************************************/
WK_FILENAME := '社員情報.csv';
if WK_CHARACTERSET = 'AL32UTF8' then
WK_FILENAME :=
CONVERT( WK_FILENAME,'JA16SJIS','AL32UTF8');
end if;
OPEN cur_main;
FILEHANDLE := UTL_FILE.FOPEN( 'ORACLEDIR', WK_FILENAME, 'w' );
LOOP
FETCH cur_main INTO COMMENT_REC;
EXIT when cur_main%NOTFOUND;
/* 内部プロシージャの呼び出し */
WRITE_DATA;
DBMS_OUTPUT.PUT_LINE(COMMENT_REC.氏名);
END LOOP;
UTL_FILE.FCLOSE( FILEHANDLE );
CLOSE cur_main;
/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;