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 回答