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

时间:2014-10-20 12:26:53

标签: 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
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

2 个答案:

答案 0 :(得分:0)

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

如果您不知道,Variant变量的设置方式是它们保留8个字节来告诉全世界实际变量类型是什么。因此,如果您在将Format函数应用到它之后传递ReportDate,那么它将是一个Variant,告诉全世界它是一个字符串。 ADO Parameter对象可能对此感到满意(毕竟SQL Server很乐意将正确格式化的字符串解析为Date字段)并且Oracle不是。在我对Oracle的有限经验中,我发现它比SQL Server更加苛刻。

尝试丢失格式化功能,看看你是否至少得到了不同的错误。

答案 1 :(得分:0)

我设法让它排序。这主要是因为我不熟悉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
    
  3. 上述工作完美无缺。

    问候,Niz