|
|
CREATE OR REPLACE PROCEDURE CSV_OUT
/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
-- ディスクへ書き込むファイル名
WK_FILENAME VARCHAR2(100);
-- キャラクタセットを表す文字列を格納
WK_CHARACTERSET VARCHAR2(100);
-- ファイルにアクセスする為のハンドルの定義
FILEHANDLE UTL_FILE.FILE_TYPE;
-- カーソルの定義
CURSOR cur_main IS
SELECT * FROM 社員マスタ
order by フリガナ;
-- 読みだすレコードの定義
COMMENT_REC cur_main%ROWTYPE;
/**********************************************************/
/* 内部プロシージャ( データ出力 ) */
/**********************************************************/
PROCEDURE WRITE_DATA
AS
-- CSV の行データを格納するエリア
WK_CSV VARCHAR2(200);
BEGIN
/***********************************************/
/* 1行ぶんのデータの作成 */
/***********************************************/
WK_CSV := COMMENT_REC.社員コード;
WK_CSV := WK_CSV || ',' || COMMENT_REC.氏名;
/***********************************************/
/* AL32UTF8 は、10g Express 対応 */
/***********************************************/
if WK_CHARACTERSET = 'AL32UTF8' then
-- ファイルへの書き込み( PUT_LINE )
UTL_FILE.PUT_LINE(
FILEHANDLE,
CONVERT( WK_CSV,'JA16SJIS','AL32UTF8')
);
else
-- ファイルへの書き込み ( 書式付き )
UTL_FILE.PUTF( FILEHANDLE, '%s\n', WK_CSV );
end if;
END;
/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
-- PL/SQL 用出力ユーティリティ
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;
/**********************************************************/
/* 一番外側のブロックの例外処理 */
/* 条件コンパイルを利用して例外処理を無効にしてエラー位置を知るには 1=2 にする */
/**********************************************************/
$if 1=1 $then
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
$end
END;
/
| |
|
※ CONVERT(char, dest_char_set[, source_char_set])
※ UTL_FILE
|
|
|
DECLARE
-- ディスクへ書き込むファイル名
WK_FILENAME VARCHAR2(100);
-- キャラクタセットを表す文字列を格納
WK_CHARACTERSET VARCHAR2(100);
-- ファイルにアクセスする為のハンドルの定義
FILEHANDLE UTL_FILE.FILE_TYPE;
-- カーソルの定義
CURSOR cur_main IS
SELECT * FROM 社員マスタ
order by フリガナ;
-- 読みだすレコードの定義
COMMENT_REC cur_main%ROWTYPE;
/**********************************************************/
/* 内部プロシージャ( データ出力 ) */
/**********************************************************/
PROCEDURE WRITE_DATA
AS
-- CSV の行データを格納するエリア
WK_CSV VARCHAR2(200);
BEGIN
/***********************************************/
/* 1行ぶんのデータの作成 */
/***********************************************/
WK_CSV := COMMENT_REC.社員コード;
WK_CSV := WK_CSV || ',' || COMMENT_REC.氏名;
/***********************************************/
/* AL32UTF8 は、10g Express 対応 */
/***********************************************/
if WK_CHARACTERSET = 'AL32UTF8' then
-- ファイルへの書き込み( PUT_LINE )
UTL_FILE.PUT_LINE(
FILEHANDLE,
CONVERT( WK_CSV,'JA16SJIS','AL32UTF8')
);
else
-- ファイルへの書き込み ( 書式付き )
UTL_FILE.PUTF( FILEHANDLE, '%s\n', WK_CSV );
end if;
END;
/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
-- PL/SQL 用出力ユーティリティ
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;
/**********************************************************/
/* 一番外側のブロックの例外処理 */
/* 条件コンパイルを利用して例外処理を無効にしてエラー位置を知るには 1=2 にする */
/**********************************************************/
$if 1=1 $then
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
$end
END;
| |
|
|
|