С помощью ADO, как мне вызвать блок Oracle PL / SQL и указать переменные связывания ввода / вывода (параметры?) - PullRequest
5 голосов
/ 03 марта 2010

Я пытаюсь вызвать блок PL / SQL с ADO и VBA, но я не могу передать входные и / или выходные переменные связывания (вероятно, также известные как параметры).

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))

Выше приведен фрагмент кода в строке cm.execute с ORA-01008: не все переменные связаны

Буду признателен за помощь в решении моей проблемы.

1 Ответ

6 голосов
/ 04 марта 2010

Кажется, что оператор не может начинаться с declare. (Спасибо Томасу Джонсу-Лоу за его ценный комментарий).

Таким образом, оператор должен быть заключен в другой 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;"

Теперь все работает как положено.

...