繁体   English   中英

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

[英]Oracle function call from VB6. Function is not a procedure error

我将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

怎么了 函数已成功编译。

先感谢您!

造成这种情况的原因很简单,因为您已将其定义为一个函数,但正在将其当作过程来调用。 可以将其作为函数调用(使用SELECT ),也可以使用IN OUT参数代替RETURNING

由于您具有函数(而不是过程),因此必须对返回值进行某些处理。 添加以下参数:

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

更新:

参数的顺序是相关的。 它必须以返回类型开头。 然后,函数的所有参数都必须遵循声明的顺序。 参数的名称无关紧要,因为在内部使用了位置(而不是命名)参数。 如果查看cmdCommandText属性,这是显而易见的:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM