我在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中定义记录?
答案 0 :(得分:1)
这里的问题是你没有定义输出参数。
adoCMD.Parameters.Append adoCMD.CreateParameter("protection_rec", adXXXX, adParamOutput, nnnnn)
唯一的问题是,我不知道你是否能做到这一点,以及用什么类型。也许adLongVarBinary可以工作,你必须从结果缓冲区中复制数据块。
为什么不能简单地将数据作为标准记录集返回,即更改存储过程以执行以下操作:
SELECT active_protection_flag, protection_type, term, protection_fee_name
如果有充分的理由不更改存储过程的接口,也许您可以创建一个包装器存储过程,它实质上将输出参数转换为SELECT语句。