2010-03-03 1 views
5

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

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: не все переменные, связанные с

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

+0

Я не уверен, что Oracle позволяет вам определять переменные внутри анонимного блока PL/SQL. Что ты пытаешься сделать? –

+0

Это, очевидно, сокращенная версия того, что я на самом деле хочу достичь. Реальная задача - создать экземпляр типа объекта PL/SQL, передать экземпляр процедуре, а затем затем оценить несколько методов и memeber по типу объекта. –

+0

Очень хороший вопрос ... бесконечно странные способы, в которых оракул и адо попадают в конфликт, бесконечно много ... –

ответ

6

Кажется, что инструкция не может начинаться с 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;" 

Теперь он работает, как ожидалось.

+0

geez, ты спас мой день! Отличная работа! Спасибо! Совершенно тупое поведение. Как вы пришли к этому решению? –