从VB6调用Oracle函数。函数不是过程错误

从VB6调用Oracle函数。函数不是过程错误,oracle,stored-procedures,vb6,oledb,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 ... 和客户端Visual Basic 6代码,以管理员身份连接到Oracle: cmd.ActiveConnection = c

我将Oracle函数声明为

create or replace FUNCTION CheckScan(
  pMode IN number, 
  pAgrISN in number, 
  pAgrId in varchar2, 
  pDocISN in number, 
  pRefundId in varchar2) RETURN NUMBER IS  ...
和客户端Visual Basic 6代码,以管理员身份连接到Oracle:

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
这里怎么了?函数已成功编译


提前谢谢你

我不知道你是否可以单独调用函数。相反,我会尝试执行一个select,比如:

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

我不知道你是否能自己调用函数。相反,我会尝试执行一个select,比如:

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

这仅仅是因为您已将其定义为函数,但正在调用它,就好像它是一个过程一样。要么将其作为函数调用(使用
选择
),要么使用
输入输出
参数代替
返回

,这仅仅是因为您将其定义为函数,但调用它就像调用一个过程一样。或者将其作为函数调用(使用
选择
),或者使用
输入输出
参数代替
返回

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

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

因为您有一个函数(而不是过程),所以必须对返回值进行处理。添加以下参数:

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
更新:

参数的顺序是相关的。它必须以返回类型开头。然后,函数的所有参数必须按照声明的顺序执行。但是,参数的名称是不相关的,因为位置(未命名)参数是在内部使用的。如果查看
cmd
CommandText
属性,这一点很明显:

"{ ? = call CheckScan(?, ?, ?, ?, ?) }"
因为您有一个函数(而不是过程),所以必须对返回值进行处理。添加以下参数:

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
更新:

参数的顺序是相关的。它必须以返回类型开头。然后,函数的所有参数必须按照声明的顺序执行。但是,参数的名称是不相关的,因为位置(未命名)参数是在内部使用的。如果查看
cmd
CommandText
属性,这一点很明显:

"{ ? = call CheckScan(?, ?, ?, ?, ?) }"

连接到Oracle DB的用户是否具有该函数的执行权限?此外,该函数正在返回一个值,您是否正在捕获它?是的,它是一个管理员帐户连接到Oracle DB的用户是否对该函数具有执行权限?另外,该函数正在返回一个值,您是否捕获了它?是的,它是一个管理员帐户Nice…我也打算让他这么做。Nice…我也打算让他这么做。谢谢,@Gaius,我用4(返回值)参数重构了代码-现在它返回:PLS-00306(调用“CHECKSCAN”时参数的数目或类型错误) ... 我是否正确地传递了参数?谢谢,@Gaius,我用4(返回值)参数重构了代码-现在它返回:PLS-00306(调用“CHECKSCAN”时参数的数目或类型错误)。。。我传递的参数正确吗?谢谢,@Codo!我用4(返回值)参数重构了代码-现在它返回:PLS-00306(调用“CHECKSCAN”时参数的数目或类型错误)。。。我是否正确地传递了参数?@AndrewFlorko:我想你误解了我的代码。您需要五个参数:四个输入参数和一个返回值。第五个参数需要有数字类型,因为您的函数被声明为返回一个数字。不,不,我现在有6个参数(5个输入+1个返回值)。@AndrewFlorko:返回值参数作为第一个参数添加似乎很重要。我已经更新了我的答案来展示一个完整的例子。谢谢你,@Codo!我用4(返回值)参数重构了代码-现在它返回:PLS-00306(调用“CHECKSCAN”时参数的数目或类型错误)。。。我是否正确地传递了参数?@AndrewFlorko:我想你误解了我的代码。您需要五个参数:四个输入参数和一个返回值。第五个参数需要有数字类型,因为您的函数被声明为返回一个数字。不,不,我现在有6个参数(5个输入+1个返回值)。@AndrewFlorko:返回值参数作为第一个参数添加似乎很重要。我已经更新了我的答案来展示一个完整的例子。