调用返回强记录类型的oracle存储过程

时间:2012-08-01 01:25:42

标签: oracle vb6

我在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中定义记录?

1 个答案:

答案 0 :(得分:1)

这里的问题是你没有定义输出参数。

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

唯一的问题是,我不知道你是否能做到这一点,以及用什么类型。也许adLongVarBinary可以工作,你必须从结果缓冲区中复制数据块。

为什么不能简单地将数据作为标准记录集返回,即更改存储过程以执行以下操作:

SELECT active_protection_flag, protection_type, term, protection_fee_name

如果有充分的理由不更改存储过程的接口,也许您可​​以创建一个包装器存储过程,它实质上将输出参数转换为SELECT语句。