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;
  





yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[plsql]
CCBot/2.0 (https://commoncrawl.org/faq/)
19/06/25 17:24:06
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube