【问题标题】:Calling Oracle 11g Stored Procedure Using VB6使用 VB6 调用 Oracle 11g 存储过程
【发布时间】:2014-12-15 10:31:48
【问题描述】:

我有一个简单的 Oracle 程序,如下所示。我正在尝试使用 VB6 调用该过程并从该过程中提取输出。

CREATE OR REPLACE PROCEDURE EXTRACTTXN (reportdate IN DATE, p_recordset OUT SYS_REFCURSOR) AS
BEGIN
 OPEN p_recordset FOR
SELECT 
    TXN_ID,
    TXN_ACTION,
    TXN_STATUS,
    TXN_DATE,
    TXN_AMOUNT
FROM TRANSACTIONS
WHERE
    TRUNC(TXN_DATE) = TRUNC(reportdate)
END EXTRACTTXN;

VB 代码是这样的;

Sub FetchTransactions(ByVal ReportDate As Date, cnnMine as ADODB.Connection)
  On Error GoTo TrapErr
  Dim cmdMine As ADODB.Command, rsMine As ADODB.Recordset

  cmdMine.ActiveConnection = cnnMine
  cmdMine.CommandTimeout = 300
  cmdMine.CommandType = adCmdStoredProc
  cmdMine.CommandText = "EXTRACTTXN"

  cmdMine.Parameters.Append cmdMine.CreateParameter("reportdate", adDate, adParamInput, , Format(ReportDate, "DD-MMM-YYYY"))
  cmdMine.Parameters.Append cmdMine.CreateParameter("p_recordset", adVariant, adParamOutput)
  Set rsMine = cmdMine.Execute

  Do While rsMine.EOF
      Debug.Print rsMine!TXN_ID, rsMine!TXN_ACTION, rsMine!TXN_STATUS, rsMine!TXN_DATE, rsMine!TXN_AMOUNT
      rsMine.MoveNext
  Loop
  rsMine.Close

  Exit Sub
TrapErr:
  MsgBox Err.Number & " - " & Err.Description, vbExclamation, App.ProductName
End Sub

在运行代码时,我收到以下错误:

ORA-06550:第 1 行,第 7 列: PLS-00306:调用“EXTRACTTXN”的参数数量或类型错误 ORA-06550:第 1 行,第 7 列: PL/SQL:语句被忽略

我的代码有什么问题吗?感谢帮助。 尼兹

【问题讨论】:

    标签: stored-procedures oracle11g vb6


    【解决方案1】:

    问题在于您在 VB 代码中指定的参数类型与在 PL/SQL 代码中指定的参数类型不匹配。问题的最可能原因是 VB6 中的 Format 函数返回 Variant 类型,而不是 Date 类型,并且 Variant 类型设置为 String 类型。有关 Format 函数的更多信息,请参阅this

    如果您不知道,Variant 变量的设置方式是它们保留 8 个字节来告诉世界实际的变量类型是什么。因此,如果您在向其应用 Format 函数后将 ReportDate 传递给它,它将是一个 Variant,它告诉世界它是一个字符串。 ADO Parameter 对象可能对此感到满意(毕竟,SQL Server 很乐意将格式正确的字符串解析为日期字段),而 Oracle 则不然。根据我对 Oracle 的有限经验,我发现它比 SQL Server 更麻烦。

    尝试丢失 Format 函数,看看您是否至少得到不同的错误。

    【讨论】:

    • @Bob...感谢您的回归。您对 Oracle 行为的 cmets 非常正确。我试图让问题变得更简单。我删除了输入参数(ReportDate),但留下了输出参数(p_recordset)。还要删除 Oracle SP 上的 WHERE 子句。通过使用类似的 VB 代码,我尝试提取,现在 VB 踢出一个没有错误编号或描述的错误。但是记录集上没有任何数据。我的简单需求是使用 VB6 从 Oracle 中提取数据。任何帮助将非常感激。一直在为此苦苦挣扎。
    • 好的。要使用 VB6 从 Oracle 中提取数据,请从简单的“SELECT * FROM SomeTable”作为 SQL 命令开始。您需要一个 ADO Connection 对象和一个 ADO Recordset 对象。您还需要知道 Oracle 连接的正确连接字符串值。在 www.connectionstrings.com 上查找到 Oracle 的 OLE DB 连接。设置您的连接对象并打开它。然后打开记录集对象,将 sql server 字符串作为第一个参数,将连接对象作为第二个参数。你应该得到一个包含你的数据的记录集。
    • 请记住,这不是(重复不)生产的方式。存储过程是。但是一次增加一层复杂性。首先,只需正确连接并能够通过它选择数据。然后开始研究如何访问存储过程。
    【解决方案2】:

    我已经设法解决了这个问题。这主要是因为我不熟悉 Oracle 及其复杂性。

    这是我所做的更改;

    1. 存储过程更改。请注意,我在 Where 子句中更改了 TRUNC(reportdate, 'DD')。

      CREATE OR REPLACE PROCEDURE EXTRACTTXN (reportdate IN DATE, p_recordset OUT SYS_REFCURSOR) AS
      BEGIN
      OPEN p_recordset FOR
      SELECT 
         TXN_ID,
         TXN_ACTION,
         TXN_STATUS,
         TXN_DATE,
         TXN_AMOUNT
      FROM TRANSACTIONS
      WHERE
          TRUNC(TXN_DATE) = TRUNC(reportdate, 'DD')
      END EXTRACTTXN;
      
    2. VB 代码更改(请注意,我用 Call 更改了括号内的 CommandText,删除了参数名称,将日期格式更改为 DD/MMM/YYYY 并删除了输出参数)

      Sub FetchTransactions(ByVal ReportDate As Date, cnnMine as ADODB.Connection)
          On Error GoTo TrapErr
          Dim cmdMine As ADODB.Command, rsMine As ADODB.Recordset
      
          cmdMine.ActiveConnection = cnnMine
          cmdMine.CommandTimeout = 300
          cmdMine.CommandType = adCmdStoredProc
          cmdMine.CommandText = "{ call EXTRACTTXN}"
      
          cmdMine.Parameters.Append cmdMine.CreateParameter(, adDate, adParamInput, , Format(ReportDate, "DD/MMM/YYYY"))
          Set rsMine = cmdMine.Execute
      
          Do While rsMine.EOF
              Debug.Print rsMine!TXN_ID, rsMine!TXN_ACTION, rsMine!TXN_STATUS, rsMine!TXN_DATE, rsMine!TXN_AMOUNT
              rsMine.MoveNext
          Loop
          rsMine.Close
      
          Exit Sub
        TrapErr:
          MsgBox Err.Number & " - " & Err.Description, vbExclamation, App.ProductName
        End Sub
      

    以上工作完美。

    问候,尼兹

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多