アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel:2010
Oracle:10g
接続:ADODB

Oracleで質問すべきか、VB側にすべきか迷いましたが、こちらに質問させていただきます。
ExcelVBAからOracleに接続し、ストアドを実行して複数行のデータを取得後
エクセルの各セルに取得データを設定するマクロを作成しております。

コマンドのExecuteを行った後、レコードセットが取得できていないようで
「オブジェクトが閉じている場合は、操作は許可されません」
となってしまいます。
ストアド自身は、Oracle側でエラーなく動いています。
カーソルで取得したデータをエクセル側に渡すには、それ用のOutputの変数(配列?)が必要なのでしょうか?
よろしくお願いいたします。

ストアドプロシージャ(一部SELECT文は長いため、省いています)
--------------------

CREATE OR REPLACE PROCEDURE A.P930
(
varCD IN VARCHAR2,
varDate IN VARCHAR2
)
AS
CURSOR C_SIM IS
SELECT
CD,
NAME
FROM T
WHERE
CD = varCD AND
CNTRCT_DATE = varDate;
SIM_REC C_SIM%ROWTYPE;

BEGIN
OPEN C_SIM;

LOOP
FETCH C_SIM INTO SIM_REC;
EXIT WHEN C_SIM%NOTFOUND;
END LOOP;

CLOSE C_SIM;

END;
/

VBA側
Connection接続はOK
--------------------
Sub LIST()

変数宣言等省いています

Set myCmd = New ADODB.Command

With myCmd
.ActiveConnection = DBADOCon

.CommandType = adCmdStoredProc
.CommandText = "P930"

.Parameters.Append .CreateParameter("varCD", adVarChar, adParamInput, 3, strLineCd)
.Parameters.Append .CreateParameter("varDate", adVarChar, adParamInput, 6, strMonth)

Set myRs = New ADODB.Recordset
Set myRs = .Execute

End With

If myRs.RecordCount = 0 Then     ←ここでエラーになります
'エラーメッセージ表示
Exit Sub
End I

A 回答 (2件)

ん?



> CREATE OR REPLACE PROCEDURE A.P930
> (
> varCD IN VARCHAR2,
> varDate IN VARCHAR2
> )

は procedure (function じゃない)だし、out の引数もないから、

> Set myRs = .Execute

ではなにもかえってこないんではないですか??

function の戻り値を ADO で得るためには、なんかくふうが要るようだ。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …

out で戻すなら、
http://www.progress-japan.co.jp/support/SupportL …

ADODB.Command.Execute の戻り値は Command が SQL であるときのレコードセットじゃないかな??

ADOのしがらみがめんどうならば、ストアードで、ワークテーブルに書き込んで、
execute の戻り値をとらずに、ワークテーブルを直接見に行くかしたらいいんじゃないですかね?
 
 
 
    • good
    • 0
この回答へのお礼

ありがとうございます!
エラーの原因はわかりました。
カウントの仕方が違っていたようです。

やはり、outの引数がない場合は何も返ってこないんですかね?
ストアドプロシージャとファンクションの違い、検索してみますね。

ワークテーブル等使うと楽そうですよね・・・
ただ、お客様からの仕様がストアドを作ってそれを見に行け
という感じなので、もうちょっとやってみます!

お礼日時:2012/06/05 14:59

参考になるかどうかは分かりませんが…


参照URLはもうご覧になってますか?

参考URLはSQL Serverでのケースですが、
ストアド内で複数のSQL文を使っている場合に
このエラーが出るようです。

参考URL:http://nary.cocolog-nifty.com/blog/2009/12/sql-s …

この回答への補足

nao-yさん、お返事ありがとうございます。
4時間くらいずっと検索し続けていましたので、こちらのページも拝見いたしました。
Oracleではまた違うような感じで・・・

SQL文は1つですが、UNIONのSQL文にしています。
ある条件で抽出し、UNIONでそれぞれの列のSUMを最後に取っています。
OracleのSQL文も久しぶりなのですが、やっとストアドのコンパイルエラーがなくなったと思ったら
VBA側からのエラーがどうにも解決できず(>_<)
カーソル自体あまりわかっていないのでそちらも合っているのか・・・

補足日時:2012/06/04 23:08
    • good
    • 0
この回答へのお礼

まだきちんとテストできていませんが、自己解決です。
myRs.RecordCount
ではなく、myCmd.RecoreCount
のようです。

お礼日時:2012/06/05 14:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す