2010-03-03 14 views
5

Próbuję wywołać blok PL/SQL z ADO i VBA, ale nie mogę przekazać danych wejściowych i/lub wyjściowe zmienne wiążące (prawdopodobnie aka parametry).W ADO, jak wywołać blok PL/SQL Oracle i określić zmienne wiążące wejścia/wyjścia (parametry?)

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

Fragment powyżej nie na linii cm.execute z ORA-01008: nie wszystkie zmienne związane

będę wdzięczny za każdą pomoc w rozwiązaniu dla mojego problemu.

+0

Nie jestem pewien, czy Oracle pozwala definiować zmienne wewnątrz anonimowego bloku PL/SQL. Co próbujesz zrobić? –

+0

To jest oczywiście przycięta wersja tego, co naprawdę chcę osiągnąć. Prawdziwą rzeczą jest utworzenie instancji typu PL/SQL, przekazanie instancji do procedury, a następnie ocena kilku metod i odczytywanie typu obiektu po nim. –

+0

Bardzo dobre pytanie ... nieskończenie dziwne sposoby, w jakie wyrocznia i ado wchodzą w konflikt, są nieskończenie wiele ... –

Odpowiedz

6

Wygląda na to, że oświadczenie nie może się rozpocząć od declare. (Podziękowania dla Thomasa Jonesa-Low za jego cenny komentarz).

Tak, oświadczenie musi być ujęty w innym begin .. end bloku:

' 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;" 

teraz, to działa zgodnie z oczekiwaniami.

+0

geez, uratowałeś mój dzień! Dobra robota! Dziękuję Ci! Całkowicie głupie zachowanie. Jak doszło do tego rozwiązania? –

Powiązane problemy