将系统参考光标从Oracle函数/存储过程返回到VBA

将系统参考光标从Oracle函数/存储过程返回到VBA,oracle,vba,excel,oracle11g,adodb,Oracle,Vba,Excel,Oracle11g,Adodb,我正在尝试使用VBA将记录集检索回ADODB对象。我在Oracle(11g)数据库包中有一个非常基本的功能: CREATE OR REPLACE PACKAGE "DATABASE"."PKG_INDEX" AS FUNCTION get_diary(event_date IN DATE := NULL) RETURN SYS_REFCURSOR; END PKG_AIT_INDEX; CREATE

我正在尝试使用VBA将记录集检索回ADODB对象。我在Oracle(11g)数据库包中有一个非常基本的功能:

            CREATE OR REPLACE PACKAGE "DATABASE"."PKG_INDEX" AS
            FUNCTION get_diary(event_date IN DATE := NULL) RETURN SYS_REFCURSOR;
            END PKG_AIT_INDEX;

            CREATE OR REPLACE PACKAGE BODY "DATABASE"."PKG_INDEX" AS
            FUNCTION get_diary(event_date IN DATE := NULL)
            RETURN SYS_REFCURSOR
            IS
            my_cursor  SYS_REFCURSOR;
            search_date EVENTS.EVENT_DATE%TYPE;
            BEGIN
            If event_date Is Null Then
            search_date := TRUNC(SYSDATE);
            Else
            search_date := event_date;
            END IF;
            OPEN my_cursor FOR
            SELECT *
            FROM Table
            WHERE EVENT_DATE > search_date;
            RETURN my_cursor;
            END get_diary;
            END PKG_INDEX;
在DB Visualiser中调用该函数时,其行为与预期一致:

            --/
            DECLARE
            rc SYS_REFCURSOR;
            BEGIN
            rc := PKG_INDEX.GET_DIARY(NULL);
            END;
            /
我想从VBA调用函数并获取记录集。我尝试了许多不同的方法,但都无法找到解决办法

            Public Function ExecuteFunction(sDBName As String, sDBEnv As String, sDBRegion As String, sCommand As String, Optional sDBConn As String, Optional sError As String) As Recordset
            Dim oConn As ADODB.Connection
            Dim oCmd As ADODB.Command
            Dim oParam As ADODB.Parameter
            Dim oRst As ADODB.Recordset

            Const SOURCE As String = "ExecuteQuery"

            If GetDBConnection(oConn, sDBName, sDBEnv, sDBRegion, sDBConn, sError) Then

            Set oCmd = New ADODB.Command
            With oCmd
            Set .ActiveConnection = oConn
            .CommandType = adCmdText
            .CommandText = "BEGIN :returnValue :=PKG_INDEX.GET_DIARY; END;"

            Set oParam = .CreateParameter("returnValue", adVariant, adParamInputOutput, 100000)
            .Parameters.Append oParam

            Set oRst = .Execute
            End With
            Set ExecuteFunction = oRst

            End If

            End Function
以上是一次尝试,但没有将任何内容传递回参数,我得到:

ORA-01008: not all variables bound
我的连接字符串是:

Provider=MSDAORA;User ID=XXX;Password=XXX;Data Source=(DESCRIPTION = (ADDRESS_LIST 
= (ADDRESS = (PROTOCOL = TCP)(HOST = XXXX)(PORT = XXXX)) ) (CONNECT_DATA = (SID = XXXX)));
似乎很难做到一些很容易的事情

任何帮助或建议都将不胜感激

终于找到了一个好例子:

或使用CreatePLSQLDynaset方法:


试试这个?发现这有点误导,因为VBA在.net类的参数上没有返回类型。上面的例子似乎有效(最后)。无论如何,谢谢。虽然我不太明白。在“从ADO调用存储过程”链接中的CommandText arg person正在使用。CommandText={调用PackageName.ProcName(?,,,,{resultset 0,o_resultset},0)}。。。。o_resultset是一个输入参数,但resultset在哪里定义?这是最好的方法吗?和往常一样,任何评论都很受欢迎。“从ADO调用存储过程”链接对我很有用。非常感谢您的分享;我想让它工作,真是疯了!