【发布时间】: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