在这篇文章的前言中,我想说我是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 ......我根本没有对存储过程的控制,它来自外部包。
非常感谢任何帮助。
谢谢, 多伦
答案 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"