使用ADO,如何调用Oracle PL/SQL块并指定输入/输出绑定变量(参数?)

Ren*_*ger 5 oracle vba ado

我试图用ADO和VBA调用PL/SQL块,但我无法传递输入和/或输出绑定变量(可能也称为参数).

dim cn as ADODB.connection
' ... open connection ...

dim plsql as string

plsql =         "declare"
plsql = plsql & "  num_in  number := ?;"
plsql = plsql & "  num_out number; "
plsql = plsql & "begin"
plsql = plsql & "  num_out := num_in * 5;"
plsql = plsql & "  ? := num_out;"
plsql = plsql & "end;"

dim cm as ADODB.command
set cm = new ADODB.command
set cm.activeConnection = cn
cm.commandText = plsql
cm.commandType = adCmdText

cm.parameters.append cm.createParameter(, adDouble, adParamInput,, 5)
cm.parameters.append cm.createParameter(, adDouble, adParamOutput   )

cm.execute  ' FAILS HERE

msgBox(cm.parameters(2))
Run Code Online (Sandbox Code Playgroud)

上面的代码段在ORA-01008cm.execute行上失败:并非所有变量都绑定

我很感激为解决我的问题提供任何帮助.

Ren*_*ger 6

似乎声明不能以a开头declare.(感谢Thomas Jones-Low的宝贵评论).

因此,该声明必须包含在另一个begin .. end块中:

' additional begin so that the statement does not start with a declare:
plsql =         "begin "

plsql = plsql & "declare"
plsql = plsql & "  num_in  number := ?;"
plsql = plsql & "  num_out number; "
plsql = plsql & "begin"
plsql = plsql & "  num_out := num_in * 5;"
plsql = plsql & "  ? := num_out;"
plsql = plsql & "end;"

' closing the additional begin:
plsql = plsql & "end;"
Run Code Online (Sandbox Code Playgroud)

现在,它按预期工作.