PL / SQL存储过程将游标输出到VBA ADODB.RecordSet?

时间:2014-05-08 23:24:03

标签: oracle excel-vba cursor vba excel

在这篇文章的前言中,我想说我是Excel 2007 vba宏的新手。我试图调用一个将游标作为输出参数的Oracle PL / SQL存储过程。程序规范如下所示:

PROCEDURE get_product
(
    out_cur_data    OUT SYS_REFCURSOR,
    rptid           IN  NUMBER,
    scenario        IN  VARCHAR2
);

我把我的宏写成:

Sub GetProduct()
    Const StartRow As Integer = 4
    Dim conn As ADODB.Connection
    Set conn = New ADODB.Connection
    With conn
        .ConnectionString = "<my connection string>"
        .Open
    End With

    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdText
        .CommandText = "{call their_package.get_product({out_cur_data 100},?,?)}"
        .NamedParameters = True
        .Parameters.Append cmd.CreateParameter("rptid", adNumeric, adParamInput, 0, 98)
        .Parameters.Append cmd.CreateParameter("scenario", adVarChar, adParamInput, 4, "decline001")
    End With

    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    With rs
        .CursorType = adOpenStatic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
    End With

    Set rs = cmd.Execute

    Cells(StartRow + 1, 1).CopyFromRecordset rs

    rs.Close
    conn.Close
End Sub

这显然不起作用,我得到一个运行时错误'-2147217900(80040e14):在处理命令期间发生了一个或多个错误。那么好吧。

我正在寻找有关如何将光标带回ADODB.RecordSet的一些指导/建议。我不认为我已经为“out_cur_data”正确设置了输出光标,但到目前为止,我在网上搜索任何帮助都已经干了。能不能给我一个基本的工作实例来帮助我理解我做错了什么?

BTW ......我根本没有对存储过程的控制,它来自外部包。

非常感谢任何帮助。

谢谢, 多伦

1 个答案:

答案 0 :(得分:2)

我认为应该是这个:

With cmd
    .Properties("PLSQLRSet") = TRUE
    .ActiveConnection = conn
    .CommandType = adCmdText
    .CommandText = "{call their_package.get_product(?,?)}"
    .NamedParameters = True
    .Parameters.Append cmd.CreateParameter("rptid", adNumeric, adParamInput, 0, 98)
    .Parameters.Append cmd.CreateParameter("scenario", adVarChar, adParamInput, 4, "decline001")
End With
...

Set rs = cmd.Execute
cmd.Properties("PLSQLRSet") = FALSE

注意: 虽然their_package.get_product()有三个参数,但只需要绑定两个参数,因为Ref游标参数会自动绑定。

有关更多信息,请查看Oracle文档:Oracle Provider for OLE DB Developer's Guide - "Using OraOLEDB with Visual Basic"