2012-08-01 83 views
0

我在oracle中有一个存储过程,看起来像这样:调用一个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

这里的问题是,您尚未定义输出参数。

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

唯一的是,我不知道你是否可以做到这一点,以及什么类型。也许adLongVarBinary会起作用,并且您将不得不从所产生的缓冲区中复制数据块。

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

SELECT active_protection_flag, protection_type, term, protection_fee_name 

如果有一个很好的理由不改变你的存储过程的界面,也许你可以创建一个包装存储过程,它将输出参数转化为一个SELECT语句。

+0

感谢您的回答,您对问题的正确性。我无法使用任何标准adxxxx来定义退货。我想没有办法直接做到这一点。我没有编写oracle部分,我必须让那个人适当地更新存储过程。谢谢您的帮助 – Ralph 2012-08-02 00:30:58

相关问题