0

次のようなストアド プロシージャが oracle にあります。

PROCEDURE get_protection_details (  
             i_case_key     IN  NUMBER, 
             i_eff_dt       IN  DATE,
             protection_rec OUT protection_rectype
          ) 

出力パラメーターはタイプ レコードです。パッケージでは次のように宣言されています。

TYPE crms_protection_rectype IS RECORD (
     active_protection_flag VARCHAR2(1)  := NULL,
     protection_type        VARCHAR2(30) := NULL,
     term                   VARCHAR2(30) := NULL,
     protection_fee_name    VARCHAR2(30) := 'PROTECTION'
);

私はVB6からこれを呼び出そうとしています - ここに私が持っているコードがあります

Dim adoCMD As Object
Dim rs as ADODB.recordset

Set adoCMD = CreateObject("ADODB.Command")
adoCMD.ActiveConnection = Me.Cn
adoCMD.CommandText = "fdp$product.get_protection_details"
adoCMD.CommandType = adCmdStoredProc
adoCMD.Parameters.Append adoCMD.CreateParameter("i_case_key", adDouble, adParamInput, 32000, plCaseKey) 
'//this case key is type long and value is 20305003'
adoCMD.Parameters.Append adoCMD.CreateParameter("i_eff_dt", adDate, adParamInput, 32000, Format(Now(), "DD/MM/YYYY"))
rs = adoCMD.Execute

パラメーターの数が正しくないというエラーが表示されます - かなり簡単なはずの何かに髪を引き裂きます - 定義されたレコードタイプを返すストアドプロシージャをどのように呼び出しますか?

この方法で弱いカーソルを返す例をあらゆる場所に用意してください。

どうにかしてvb6でレコードを定義する方法はありますか?

4

1 に答える 1

1

ここでの問題は、出力パラメーターを定義していないことです。

adoCMD.Parameters.Append adoCMD.CreateParameter("protection_rec", adXXXX, adParamOutput, nnnnn)

唯一のことは、これができるかどうか、どのタイプでできるかわかりません。おそらく adLongVarBinary が機能し、結果のバッファーからデータのチャンクをコピーする必要があります。

データを標準のレコードセットとして単純に返せないのはなぜですか。つまり、ストアド プロシージャを次のように変更します。

SELECT active_protection_flag, protection_type, term, protection_fee_name

ストアド プロシージャのインターフェイスを変更しない十分な理由がある場合は、基本的に出力パラメータを SELECT ステートメントに変換するラッパー ストアド プロシージャを作成できます。

于 2012-08-01T06:38:13.607 に答える