1

Access / VBA を使用して、ADO コマンド オブジェクトを使用して、Oracle ストアド プロシージャから結果セットを取得しようとしています。

エラーが表示され続けます:

[Oracle][ODBC][Ora]ORA-06550: line 1, column 19:
PLS-00201: identifier 'RETURNDATA' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

私はそれがどのように行われたかについてネット上の多くの記事を読みました-そしてそれを行うさまざまな方法を試しました(つまり、コマンドオブジェクトの代わりに実行を使用します)が、それを機能させることができないようです。

Microsoft には、これを実行する方法に関する優れたナレッジベースの記事がありましたが、彼らの例に従っているにもかかわらず、動作させることができないようです。 http://support.microsoft.com/kb/176086

Oracle SQL Developer でPL/SQLを実行すると、戻り値が [出力変数]ウィンドウに表示されます。これは、ストアド プロシージャが機能しており、必要なアクセス許可が付与されていることを示しています。

オラクルのバージョン:

SELECT * FROM v$バージョン

Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
PL/SQL Release 9.2.0.8.0 - Production
"CORE   9.2.0.8.0   Production"
TNS for 32-bit Windows: Version 9.2.0.8.0 - Production
NLSRTL Version 9.2.0.8.0 - Production

Oracle パッケージの定義:

CREATE OR REPLACE
PACKAGE test AUTHID DEFINER AS
  PROCEDURE testSP (returnData OUT NUMBER);
END test;
/
CREATE OR REPLACE
PACKAGE BODY test AS
  PROCEDURE testSP (returnData OUT NUMBER) IS
    BEGIN
      returnData := 7;
    END;
END test;

MS Access VBA コード

Public Sub testSP()
  Dim oraConn As ADODB.Connection
  Dim oraCmd As ADODB.Command
  Dim oraRetSet As ADODB.Recordset
  Dim oraNum As Integer

  Set oraConn = New ADODB.Connection

  ' Discovered I need to set this to Read/Write or the SP cannot do any INSERT operations
  oraConn.Mode = adModeReadWrite

  ' Connect to the Oracle Server
  oraConn.Open "Driver={Oracle in OraHome102};dbq=oradsn;Uid=username;Pwd=password"

  ' Set up our Command.
  Set oraCmd = New ADODB.Command
  Set oraCmd.ActiveConnection = oraConn
  oraCmd.CommandType = adCmdText
  oraCmd.Parameters.Append oraCmd.CreateParameter("returnData", adNumeric, adParamOutput)
  oraCmd.CommandText = "{CALL test.testSP({resultset 1, returnData})}"

  ' Set up our Recordset
  Set oraRetSet = New ADODB.Recordset
  oraRetSet.CursorType = adOpenStatic

  ' Attach our Recordset to our Command
  Set oraRetSet.Source = oraCmd

  ' Open our Recordset
  oraRetSet.Open

  ' Retreive our Stored Procedure Result
  oraNum = oraRetSet.Fields(0).Value

  ' Display Result to user
  Debug.Print ">>> Return Value: " & oraNum

  ' Close the Recordset & Connection Objects
  oraRetSet.Close
  oraConn.Close

  ' Clean Up
  Set oraConn = Nothing
  Set oraCmd = Nothing
  Set oraRetSet = Nothing

End Sub

私は実際に空白を描いています。つまり、おそらく私が見逃した小さなものです。どんな助けでも大歓迎です。

更新 8 月 29 日 進展がありません。ガイドとして別のスタックオーバーフローの質問/回答に従って、ODBCからOLEDBプロバイダーに切り替えようとしました:

Excel VBA スクリプトから Oracle ストアド プロシージャを呼び出すにはどうすればよいですか?

' Connect to the Oracle Server
oraConn.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=oradsn;" & _
                 "User ID=username;Password=password;"
oraConn.Open

Set oraCmd = New ADODB.Command
Set oraCmd.ActiveConnection = oraConn
oraCmd.Parameters.Append oraCmd.CreateParameter("returnData", adSmallInt, adParamOutput)
oraCmd.Properties("PLSQLRSet") = True
oraCmd.CommandText = "{CALL test.testSP(?)}"
Set oraRetSet = oraCmd.Execute
oraCmd.Properties("PLSQLRSet") = False

oraNum = oraRetSet.Fields(0).Value

これにより、宣言されていない識別子が取り除かれますが、レコードセットは返されません.. oraRetSet.Fields.Count が 0 に等しい

4

1 に答える 1