Oracle : PL/SQL : CSV出力( UTL_FILE パッケージ と ディレクトリオブジェクト )

  必要なもの



1) ディレクトリオブジェクト

▼ ディレクトリオブジェクトの作成( ツール )

ブラウザでダウンロード

2) UTL_FILE パッケージ( Express Edition 使用時の注意 )



  基本雛型



  
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



  一時的な実行

このプロシージャは引数が無いので、

CREATE OR REPLACE PROCEDURE CSV_OUT
AS



DECLARE

に変わっているだけですが、実際はプログラムから文字列を埋め込んで動的に実行します

  
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;
  











  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ