2010-03-03 7 views
5

Sto provando a chiamare un blocco PL/SQL con ADO e VBA, ma non posso passare input e/o output bind variables (probabilmente anche parametri).Con ADO, come faccio a chiamare un blocco Oracle PL/SQL e specificare le variabili di binding di input/output (parametri?)

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

Il frammento sopra non riesce alla linea cm.execute con una ORA-01008: non tutte le variabili vincolate

Apprezzerei tutto l'aiuto verso una soluzione per il mio problema.

+0

Non sono sicuro che Oracle ti permetta di definire variabili all'interno del blocco anonimo di PL/SQL come quello. Cosa stai cercando di fare? –

+0

Questa è ovviamente una versione ridotta di ciò che in realtà voglio ottenere. La cosa reale è istanziare un tipo di oggetto PL/SQL, passare l'istanza ad una procedura, e poi valutare alcuni metodi e memeber sul tipo di oggetto in seguito. –

+0

Ottima domanda ... i modi infinitamente bizzarri in cui oracolo e ado entrano in conflitto sono infiniti ... –

risposta

6

Sembra che l'istruzione non possa iniziare con declare. (Grazie a Thomas Jones-Low per il suo prezioso commento).

Quindi, la dichiarazione deve essere racchiuso in un altro blocco 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;" 

Ora, funziona come previsto.

+0

accidenti, mi hai salvato la giornata! Buon lavoro! grazie! Comportamento totalmente stupido Come sei arrivato a questa soluzione? –