调用一个Oracle存储过程返回一个强大的记录类型
问题描述:
我在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中以某种方式定义记录?
答
这里的问题是,您尚未定义输出参数。
adoCMD.Parameters.Append adoCMD.CreateParameter("protection_rec", adXXXX, adParamOutput, nnnnn)
唯一的是,我不知道你是否可以做到这一点,以及什么类型。也许adLongVarBinary会起作用,并且您将不得不从所产生的缓冲区中复制数据块。
为什么你不能简单地返回数据作为标准的记录,即改变你的存储过程执行以下操作:
SELECT active_protection_flag, protection_type, term, protection_fee_name
如果有一个很好的理由不改变你的存储过程的界面,也许你可以创建一个包装存储过程,它将输出参数转化为一个SELECT语句。
感谢您的回答,您对问题的正确性。我无法使用任何标准adxxxx来定义退货。我想没有办法直接做到这一点。我没有编写oracle部分,我必须让那个人适当地更新存储过程。谢谢您的帮助 – Ralph 2012-08-02 00:30:58