Stored procedures 使用VB6调用Oracle 11g存储过程
我有一个简单的Oracle过程,如下所示。我试图使用VB6调用该过程,并从该过程中提取输出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
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字符串作为第一个参数传递,将连接对象作为第二个参数传递。您应该获得一个包含数据的记录集。请记住,这不是生产中的重复方式。存储过程是。但是一次增加一个层次的复杂性。首先,只需正确连接并能够通过它选择数据。然后开始研究如何访问存储过程。