ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: PL/SQL 側の CSV出力
名前: lightbox
処理選択
パスワード

件名 PL/SQL 側の CSV出力
名前 lightbox
コメント
@DIV
Windows 側で作成された文字列をパラメータ(引数) で、入力し、
それをそのまま使って動的にカーソルを作成し、
ループ処理を用いて、テキストファイルに出力する
@END

プロシージャ名 : CSV高速出力

[[事前確認事項]]
@DIV
1) Windows 環境で出力テストしたスキーマと同じスキーマに作成する
2) 使用するディレクトリオブジェクトの確認
	@C:red(select * from ALL_DIRECTORIES)
	ディレクトリオブジェクトに定義されてる物理ディレクトリが存在するか確かめる
@END

[[ファイル出力のサンプル]]
@DIV
@C:green(/**********************************************************/
/* 定義部分 */
/**********************************************************/)
FILEHANDLE	UTL_FILE.FILE_TYPE;

----------------------------------------------------------
FILEHANDLE := UTL_FILE.FOPEN( 'MYDIR', WK_FILENAME, 'w' );

LOOP
	FETCH cur_main INTO COMMENT_REC;
	EXIT when cur_main%NOTFOUND;

	UTL_FILE.PUTF( FILEHANDLE, '%s\n', WK_CSV );

END LOOP;

UTL_FILE.FCLOSE( FILEHANDLE );
@END

[[動的カーソルのサンプル]]
@DIV
@C:green(/**********************************************************/
/* 定義部分 */
/**********************************************************/)
検索cur SYS_REFCURSOR;

---------------------------------------------------------

@C:green(/**********************************************************/
/* 動的 SELECT */
/**********************************************************/)
WK_VALUE := 'SELECT * FROM 社員マスタ WHERE 社員コード >= :仮引数';
OPEN 検索cur for WK_VALUE using PM_STRING;
LOOP
	FETCH 検索cur INTO 社員_REC;
	EXIT when 検索cur%NOTFOUND;
	DBMS_OUTPUT.PUT_LINE( 社員_REC.社員コード || ' : ' || 社員_REC.氏名);
END LOOP;
CLOSE 検索cur;
@END


[[引数の文字列で、動的カーソルを作成する]]
@DIV
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

@C:green(/**********************************************************/
/* 変数の定義 */
/**********************************************************/)
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	@C:red(検索cur SYS_REFCURSOR;)

@C:green(/**********************************************************/
/* 処理開始 */
/**********************************************************/)
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	@C:red(OPEN 検索cur for PM_STRING;
	CLOSE 検索cur;)

@C:green(/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/)
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
@END

[[DB からデータを取得]]
@DIV
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

@C:green(/**********************************************************/
/* 変数の定義 */
/**********************************************************/)
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	検索cur SYS_REFCURSOR;

@C:green(/**********************************************************/
/* 処理開始 */
/**********************************************************/)
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	OPEN 検索cur for PM_STRING;
	@C:red(LOOP)
		@C:red(FETCH 検索cur INTO WK_VALUE;)
		@C:red(EXIT when 検索cur%NOTFOUND;)
		DBMS_OUTPUT.PUT_LINE( substr(WK_VALUE,1,20) );
	@C:red(END LOOP;)
	CLOSE 検索cur;

@C:green(/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/)
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
@END

[[ファイルの出力先を決定]]
@DIV
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

@C:green(/**********************************************************/
/* 変数の定義 */
/**********************************************************/)
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	検索cur SYS_REFCURSOR;
	@C:red(FILEHANDLE	UTL_FILE.FILE_TYPE;)

@C:green(/**********************************************************/
/* 処理開始 */
/**********************************************************/)
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	FILEHANDLE := @C:red(UTL_FILE.FOPEN)( 'CSV', '高速出力.CSV', 'w' );

	OPEN 検索cur for PM_STRING;
	LOOP
		FETCH 検索cur INTO WK_VALUE;
		EXIT when 検索cur%NOTFOUND;
		DBMS_OUTPUT.PUT_LINE( substr(WK_VALUE,1,20) );
	END LOOP;
	CLOSE 検索cur;

	@C:red(UTL_FILE.FCLOSE)( FILEHANDLE );

@C:green(/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/)
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
@END


[[データを出力]]
@DIV
PROCEDURE CSV高速出力
(
	PM_STRING IN VARCHAR2
)

@C:green(/**********************************************************/
/* 変数の定義 */
/**********************************************************/)
AS
	RET_VALUE	VARCHAR2(2000);
	WK_VALUE	VARCHAR2(2000);

	検索cur SYS_REFCURSOR;
	FILEHANDLE	UTL_FILE.FILE_TYPE;

@C:green(/**********************************************************/
/* 処理開始 */
/**********************************************************/)
BEGIN
	DBMS_OUTPUT.PUT_LINE('デバッグ:開始');

	FILEHANDLE := UTL_FILE.FOPEN( 'CSV', '高速出力.CSV', 'w' );

	OPEN 検索cur for PM_STRING;
	LOOP
		FETCH 検索cur INTO WK_VALUE;
		EXIT when 検索cur%NOTFOUND;

		@C:red(UTL_FILE.PUTF)( FILEHANDLE, '%s\n', WK_VALUE );
		DBMS_OUTPUT.PUT_LINE( substr(WK_VALUE,1,20) );
	END LOOP;
	CLOSE 検索cur;

	UTL_FILE.FCLOSE( FILEHANDLE );

@C:green(/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/)
EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;
@END