2

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

上記は 1 つの試みでしたが、パラメーターに何も返されず、次のようになります。

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)));

非常に簡単なことを達成するのは非常に難しいようです。

どんな助けや提案も大歓迎です。

最後に良い例を見つけました:

ADO からのストアド プロシージャの呼び出し

または、CreatePLSQLDynaset メソッドを使用します。

CreatePLSQLDynaset メソッド

4

0 に答える 0