Stored procedures 使用VB6调用Oracle 11g存储过程

Stored procedures 使用VB6调用Oracle 11g存储过程,stored-procedures,oracle11g,vb6,Stored Procedures,Oracle11g,Vb6,我有一个简单的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 F

我有一个简单的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:忽略语句

我的代码有问题吗?谢谢你的帮助。
Niz

问题在于VB代码中指定的参数类型与PL/SQL代码中指定的参数类型不匹配。问题最可能的原因是VB6中的Format函数返回变量类型,而不是日期类型,并且该变量类型被设置为字符串类型。有关格式功能的更多信息,请参阅

如果您不知道,设置变量的方式是,它们保留8个字节来告诉世界实际的变量类型是什么。因此,如果在应用Format函数后传入ReportDate,它将是一个变体,告诉世界它是一个字符串。ADO参数对象可能很高兴SQL Server能够将格式正确的字符串解析为日期字段,而Oracle则不然。在我对Oracle有限的经验中,我发现它对这类事情比SQL Server更挑剔


尝试丢失Format函数,看看是否至少会出现另一个错误。

我已成功将其排序。这主要是因为我对甲骨文和它的复杂性还不熟悉

以下是我所做的改变

存储过程更改。请注意,我已经更改了Where子句中的trunreportdate“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;
VB代码更改注意,我通过调用更改了括号内的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
上述方法非常有效


你好,尼兹

@Bob…谢谢你的复出。您对Oracle行为的评论非常正确。我试图让这个问题变得更简单。我删除了输入参数ReportDate,但保留了输出参数p_记录集。还删除了Oracle SP上的WHERE子句。通过使用类似的VB代码,我尝试了提取,现在VB抛出了一个没有错误号或描述的错误。但是记录集上没有任何数据。我的简单需求是使用VB6从Oracle提取数据。任何帮助都将不胜感激。我一直在努力解决这个问题。要使用VB6从Oracle提取数据,请使用简单的SELECT*FROMSOMETABLE命令作为SQL命令。您需要一个ADO连接对象和一个ADO记录集对象。您还需要知道Oracle连接的正确connectionstring值。在www.connectionstrings.com上查找到Oracle的OLE DB连接。设置连接对象并将其打开。然后打开记录集对象,将sql server字符串作为第一个参数传递,将连接对象作为第二个参数传递。您应该获得一个包含数据的记录集。请记住,这不是生产中的重复方式。存储过程是。但是一次增加一个层次的复杂性。首先,只需正确连接并能够通过它选择数据。然后开始研究如何访问存储过程。