Sql 使用refcursor使用VBA调用Oracle存储过程
我在Oracle中有一个存储过程:Sql 使用refcursor使用VBA调用Oracle存储过程,sql,excel,oracle,vba,stored-procedures,Sql,Excel,Oracle,Vba,Stored Procedures,我在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
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的变量是否需要以与第二个代码段中不同的方式声明,但我不确定这是否是错误
谢谢 试试这个:
Cmd.Properties ("PLSQLRSet") = TRUE
Set rs = cmd.Execute
arr = rs.GetRows
'Work with array...
我意外地找到了解决办法。 如果我不定义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规范,默认情况下是这样的:当您只有一个输出参数时,为什么要使用过程?为此使用一个函数。谢谢你的建议。在access中与请求的名称或序号对应的集合中找不到新行项目时出现以下错误。通过省略ref_cursor参数的定义解决了这个问题是的,我忘了。请参阅:OraOLEDB为REF CURSOR绑定变量返回行集。由于OLE DB规范中没有REF CURSOR的预定义数据类型,使用者不能绑定此参数。