【问题标题】:Call Oracle stored procedure with VBA using a refcursor使用 refcursor 使用 VBA 调用 Oracle 存储过程
【发布时间】:2017-07-22 05:47:56
【问题描述】:

我在 Oracle 中有存储过程:

create or replace procedure testproc (articlenr in number, storenr in number, cweek in varchar, prc out sys_refcursor)
is begin
open prc for 
select * from weekly_revenues
where
  article = articlenr
  and period = cweek
  and store = storenr
  ;
end;

我可以使用以下 SQL 代码完美地调用该函数:

variable rc refcursor;
exec testproc(123,345,'201705',:rc);
print rc;

该代码为我提供了 2017 年第 5 周第 123 条商店 345 的所有销售数据。

现在,我想从 VBA 调用该存储过程,并尝试了以下代码:

Sub ConnectToOracle()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As New ADODB.Command
Dim param1 As New ADODB.Parameter
Dim param2 As New ADODB.Parameter
Dim arr As Variant

connstr = "Provider=msdaora;Data Source=###;User Id=###;Password=###;"

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset

cn.Open connstr

cmd.CommandText = "testproc"
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
Set param1 = cmd.CreateParameter("articlenr", adInteger, adParamInput, , 47)
Set param2 = cmd.CreateParameter("storenr", adInteger, adParamInput, , 281)
Set param3 = cmd.CreateParameter("cweek", adVarChar, adParamInput, 10, "201705")
Set param4 = cmd.CreateParameter("prc", adVariant, adParamOutput, , Null)
cmd.Parameters.Append param1
cmd.Parameters.Append param2
cmd.Parameters.Append param3
cmd.Parameters.Append param4

Set rs = cmd.Execute

arr = rs.GetRows
'Work with array...

End Sub

但是,我得到了一个箭头

Set rs = cmd.Execute

行(“ORA-0136:非法变量名/编号”)。有谁知道我怎样才能让我的代码运行?我不确定是否需要以不同的方式声明 refcursor 的变量(如在第二个代码 sn-p 中),但我不确定这是否是错误。

谢谢!

【问题讨论】:

  • 只有一个输出参数的情况下,为什么要使用过程?为此使用一个函数。

标签: sql excel oracle vba stored-procedures


【解决方案1】:

我偶然找到了解决方案。 如果我不定义 ref_cursor 参数,它可以工作。

cmd.CommandText = "testproc"
cmd.ActiveConnection = cn
cmd.CommandType = adCmdStoredProc
Set param1 = cmd.CreateParameter("articlenr", adInteger, adParamInput, , 47)
Set param2 = cmd.CreateParameter("storenr", adInteger, adParamInput, , 281)
Set param3 = cmd.CreateParameter("cweek", adVarChar, adParamInput, 10, "201705")

'Next line not needed
'Set param4 = cmd.CreateParameter("prc", adVariant, adParamOutput, , Null)

cmd.Parameters.Append param1
cmd.Parameters.Append param2
cmd.Parameters.Append param3

'Next line not needed
'cmd.Parameters.Append param4

Set rs = cmd.Execute

这行得通,显然不需要 ref_cursor 规范,默认情况下会发生 :)

【讨论】:

    【解决方案2】:

    试试这个:

    Cmd.Properties ("PLSQLRSet") = TRUE  
    Set rs = cmd.Execute
    
    arr = rs.GetRows
    'Work with array...
    

    【讨论】:

    • 感谢您的建议。我在新行“在与请求的名称或访问序号对应的集合中找不到项目”出现以下错误。通过省略 ref_cursor 参数的定义来解决它
    • 是的,没错,我忘了。请参阅Provider for OLE DB Developer's GuideOraOLEDB 返回 REF CURSOR 绑定变量的行集。因为 OLE DB 规范中没有预定义的 REF CURSOR 数据类型,所以使用者不得绑定此参数
    猜你喜欢
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2011-08-06
    • 2017-08-09
    相关资源
    最近更新 更多