こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ストアドプロシージャ結果のファイル出力について

お世話になります。

以下のようにOracleにてストアドプロシージャを作成して、
それをAccessからコールしております。
そしてそのDBMS_OUTPUTの結果をファイル出力したいのですが、
試しに「sqlstmt = "BEGIN proc_SeikyuMeisai(:yyyymm); END;"」の部分を
「sqlstmt = "spool aaa.csv BEGIN proc_SeikyuMeisai(:yyyymm); END; spool off"」
や、ストアド側でspoolしてみましたがダメでした。
UTL_FILEを使うしかないのでしょうか?
ご存じの方おられたらご教示いただけますでしょうか?
宜しくお願い致します。


【Access2003側】

' セッションの作成
Set OraSession = CreateObject("OracleInProcServer.XOraSession")

'データベースへの接続
Set OraDatabase = OraSession.OpenDatabase("Hoge", "hoge/hoge", ORADB_DEFAULT)

'■ ストアド実行 ■
sqlstmt = "BEGIN proc_SeikyuMeisai(:yyyymm); END;"

'バインド変数の設定
OraDatabase.Parameters.Add "yyyymm", 0, ORAPARM_INPUT
OraDatabase.Parameters("yyyymm").serverType = ORATYPE_NUMBER

'引数設定
OraDatabase.Parameters("yyyymm").value = Forms!F月次データ取込.txt日付1

'SQL文の実行
OraDatabase.ExecuteSQL sqlstmt

DoCmd.Hourglass False '砂時計

'バインド変数の削除
OraDatabase.Parameters.Remove "yyyymm"

'■ORACLEへの切断■
OraDatabase.Close

'オブジェクトの破棄
Set OraDatabase = Nothing
Set OraSession = Nothing

MsgBox "正常に出力されました。"


【Oracle10g】
Create or replace procedure Proc_SeikyuMeisai (
P1_YYYYMM IN number
)

IS

WK_KANID varchar2(10);
WK_CODE varchar2(6);
WK_SUU varchar2(12);
WK_TEN varchar2(9);
WK_KAI varchar2(2);
-- カーソルタイプの定義
TYPE typeMyCursor IS REF CURSOR;
-- カーソル変数の定義
curSeikyutypeMyCursor;
curID varchar2(10);
curMAX number;
curMEISAI varchar2(1000);
curTEN number;
curKAI number;

vSql varchar2(1000);

BEGIN
vSql := 'select KANNO, MEISAI_MAX, _MEISAI, HOU_TENSUU_KEI, TOTAL_KAISUU from SEIKYUUMEISAI' || P1_YYYYMM;

-- カーソルオープン
open curSeikyu for vSql;
loop
fetch curSeikyu into curID, curMAX, curMEISAI, curTEN, curKAI;
exit when curSeikyu%NOTFOUND;
WK_KANID := curID;
for nLpCnt IN 1..curMAX loop
WK_CODE := substrb(curMEISAI, 3, 6);
WK_SUU := substrb(curMEISAI, 34, 12);
WK_TEN := substrb(curMEISAI, 89, 9);
WK_KAI := lpad(curKAI, 2, 0);
dbms_output.put_line(WK_KANID || ',' || WK_CODE || ',' || WK_SUU || ',' || WK_TEN || ',' || WK_KAI);
end loop;
end loop;
end;
/

投稿日時 - 2011-07-17 21:49:48

QNo.6882031

困ってます

質問者が選んだベストアンサー

SPOOLは、SQL*Plusの命令なので
SQL*Plusを使わずに実行している
>Accessからコール
のときは使えません。

>UTL_FILEを使うしかないのでしょうか?
その通り、UTL_FILEを使ってください。

投稿日時 - 2011-07-17 22:14:04

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#2 のmuyoshid です。

済みません。
訂正します。
#1 の方がおっしゃられている通り、Stored Procedure の中でファイル
出力させたい場合は、UTL_FILE パッケージを使用する必要があります。

DBMS_OUTPUT は単に画面に出力するだけで、spool はSQL*Plus の機能です。

投稿日時 - 2011-07-18 18:11:54

ANo.2

こんにちわ。

> UTL_FILEを使うしかないのでしょうか?
loop に入る前に、dbms_output.enable(NULL) を実行してみて下さい。

詳細は、PL/SQL のパッケージリファレンスをどうぞ

投稿日時 - 2011-07-18 11:24:25

あなたにオススメの質問