我将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
这里有什么问题?功能编译成功。
提前谢谢!
答案 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,并确保您没有违反用户定义函数限制部分下的任何内容。您可能必须将其创建为存储过程(或将其包装为存储过程)。