【问题标题】:Calling an oracle stored proc that returns a strong record type调用返回强记录类型的 oracle 存储过程
【发布时间】:2012-08-01 01:25:42
【问题描述】:

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

【问题讨论】:

    标签: oracle vb6


    【解决方案1】:

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

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

    唯一的问题是,我不知道你是否可以这样做,以及使用什么类型。也许 adLongVarBinary 会起作用,但您必须从结果缓冲区中复制大块数据。

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

    SELECT active_protection_flag, protection_type, term, protection_fee_name
    

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

    【讨论】:

    • 感谢您的回答,您的问题是正确的。我无法使用任何标准的 adxxxx 来定义回报。我想没有办法直接做到这一点。我没有写 oracle 部分,我必须让那个人适当地更新存储过程。感谢您的帮助
    猜你喜欢
    • 2011-05-05
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多