コメント |
@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
|