2014-05-08 54 views
0

要开始这篇文章,我想说我对Excel 2007 vba宏很新。我试图调用一个将光标作为输出参数的Oracle PL/SQL存储过程。程序规范是这样的:PL/SQL存储过程将光标移出到VBA ADODB.RecordSet?

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”正确设置了输出光标,但是我的在线搜索任何帮助都已经干了。任何人都可以给我一个基本的实例来帮助我理解我做错了什么吗?

顺便说一句...我根本没有对存储过程的控制,它来自外部包。

任何帮助真的很感激。

感谢, 多伦

回答

1

我觉得应该是这样:

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()有三个参数,只有两个需要,因为裁判的约束游标参数由提供者自动绑定。

欲了解更多信息检查Oracle文档:Oracle Provider for OLE DB Developer's Guide - "Using OraOLEDB with Visual Basic"

+0

这是伟大的东西。但是,出于某种原因,我的“ADODB.Command”对象的“属性”表中没有“PLSQLRSet”属性。我调试了我的对象并在“属性”中检查了每个项目,但它不在那里。有一个叫做“服务器光标”,那是什么?另外,我检查了...我有VB6.5,如果这很重要。 – DoranKatt

+0

我想我明白了这一点。连接字符串中指定的错误提供者。我正在使用“Provider = MSDAORA.1;”并看到这个问题。将其更改为“Provider = OraOLEDB.Oracle;”已经修复了。 – DoranKatt

+1

是的,提供商“MSDAORA”是微软的提供商,它已被微软弃用了很长一段时间。改为使用Oracle提供者“OraOLEDB”。 –