【问题标题】:Oracle ORA-06550 identifier must be declared when called from ADO Command Object从 ADO 命令对象调用时必须声明 Oracle ORA-06550 标识符
【发布时间】:2013-08-31 19:14:29
【问题描述】:

我正在尝试使用 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 时,返回值列在 输出变量 窗口中。这告诉我存储过程正在运行,并且已授予必要的权限。

Oracle 版本:

从 v$version 中选择 *

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 提供程序,遵循另一个 stackoverflow 问题/答案作为指导:

How do I call an Oracle stored procedure from an Excel VBA script?

' 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

【问题讨论】:

    标签: oracle vba stored-procedures ado adodb


    【解决方案1】:

    终于搞清楚是怎么回事了。

    这个网站终于让灯亮起来了: http://www.oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php

    我试图返回一个特定的值 - 一个错误代码。在 ADO 中使用记录集更多地是为了返回数据集。

    如果您希望返回游标引用,作为记录集,您需要将 OUT 参数设置为游标引用数据类型,例如 SYS_REFCURSOR。

    create or replace
    PROCEDURE list_staff (r_stafflist OUT SYS_REFCURSOR) AS 
        BEGIN 
          OPEN r_stafflist FOR
            SELECT name,
                   telephone,
                   department
            FROM   stafflist
            ORDER BY name;
        END list_staff;
    

    然后ADO会在命令发出时自动绑定到引用光标。您不会将光标添加到 ADO Command 对象参数中。

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 1970-01-01
      • 2015-02-06
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2011-07-24
      相关资源
      最近更新 更多