我有一个简单的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
答案 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及其复杂性。
以下是我所做的更改;
存储过程更改。请注意,我已在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;
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
上述工作完美无缺。
问候,Niz