从VB6调用Oracle函数。功能不是程序错误

时间:2011-12-22 15:45:04

标签: oracle stored-procedures vb6 oledb

我将Oracle函数声明为

create or replace FUNCTION CheckScan(
  pMode IN number, 
  pAgrISN in number, 
  pAgrId in varchar2, 
  pDocISN in number, 
  pRefundId in varchar2) RETURN NUMBER IS  ...

以管理员身份连接到Oracle的客户端Visual Basic 6代码:

...

cmd.ActiveConnection = conn
cmd.CommandText = "CheckScan"
cmd.CommandType = 4 'adCmdStoredProc

Dim pMode As Integer
Dim pAgrISN As Integer
Dim pAgrId As String
Dim pDocISN As Integer
Dim pRefundId As String

pMode = 2
pAgrISN = 12345
pAgrId = "Some-Id"
pDocISN = 12345
pRefundId = "Some-id"

cmd.Parameters.Append cmd.CreateParameter("pMode", 131, 1, 10, pMode)
cmd.Parameters.Append cmd.CreateParameter("pAgrISN", 131, 1, 10, pAgrISN)
cmd.Parameters.Append cmd.CreateParameter("pAgrId", 200, 1, 255, pAgrId)
cmd.Parameters.Append cmd.CreateParameter("pDocISN", 131, 1, 255, pDocISN)
cmd.Parameters.Append cmd.CreateParameter("pRefundId", 200, 1, 255, pRefundId)

cmd.Execute

此代码以:

结尾
PLS-00221: "CHECKSCAN" is not a procedure or is undefined

这里有什么问题?功能编译成功。

提前谢谢!

4 个答案:

答案 0 :(得分:3)

这只是因为您已将其定义为函数而引起的,但它正在调用它,就像它是一个过程一样。要么将其称为函数(使用SELECT),要么使用IN OUT参数代替RETURNING

答案 1 :(得分:3)

由于你有一个函数(而不是一个过程),你必须对返回值做一些事情。添加以下参数:

With cmd
    .Parameters.Append .CreateParameter("pRetval", adNumeric, adParamReturnValue)
    .Parameters.Append .CreateParameter("pMode", adNumeric, adParamInput, 10, pMode)
    .Parameters.Append .CreateParameter("pAgrISN", adNumeric, adParamInput, 10, pAgrISN)
    .Parameters.Append .CreateParameter("pAgrId", adVarChar, adParamInput, 255, pAgrId)
    .Parameters.Append .CreateParameter("pDocISN", adNumeric, adParamInput, 255, pDocISN)
    .Parameters.Append .CreateParameter("pRefundId", adVarChar, adParamInput, 255, pRefundId)

    .Execute
End With

<强>更新

参数的顺序是相关的。它必须以返回类型开头。然后,函数的所有参数必须按照声明的顺序进行。参数的名称无关紧要,因为内部使用了位置(而非命名)参数。如果您查看CommandText的{​​{1}}属性:

,这一点很明显
cmd

答案 2 :(得分:2)

我不知道你是否可以自己调用一个函数。相反,我会尝试执行一个选择,例如:

select CheckScan(:pMode, :pAgrISN, :pArgId, :pDocISN, :pRefundId) from dual;

答案 3 :(得分:1)

这个功能有什么作用? Oracle对函数有一定的限制(在某些情况下不允许进行更新等)。 Check out this doc,并确保您没有违反用户定义函数限制部分下的任何内容。您可能必须将其创建为存储过程(或将其包装为存储过程)。