2010-03-03 20 views
5

ADO ve VBA ile bir PL/SQL bloğu çağırmaya çalışıyorum, ancak girişi geçemiyorum ve/veya çıkış değişkenleri (muhtemelen aka parametreleri). değil benim sorun için bir çözüm yolunda herhangi bir yardım takdir ediyorumADO ile, nasıl bir Oracle PL/SQL bloğu arayabilirim ve giriş/çıkış bağlantı değişkenlerini belirtirim (parametreler?)

bağlı tüm değişkenler:

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

pasajı üzerinde bir ORA-01008 ile cm.execute çizgisinde başarısız olur.

+0

Oracle'ın anonim PL/SQL bloğu içindeki değişkenleri tanımlamanıza izin verdiğinden emin değilim. Ne yapmaya çalışıyorsun? –

+0

Bu, gerçekte elde etmek istediklerimin kesilmiş halidir. Gerçek olan, bir prosedürü bir örneğe geçirmek için bir PL/SQL nesne tipini örneklendirmek ve daha sonra, sonradan nesne türü üzerinde birkaç yöntemi ve memeyi değerlendirmektir. –

+0

Çok iyi bir soru ... oracle ve ado'nun çatıştığı sonsuz garip yollar sonsuz sayıda ... –

cevap

6

Bildirim, declare ile başlayamıyor gibi görünüyor. (Değerli yorumu için Thomas Jones-Low'a teşekkürler).

Yani, deyim başka begin .. end blokta içine alınmalıdır: beklendiği gibi

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

Şimdi, işe yarıyor.

+0

geez, günümü kurtardın! Aferin! teşekkür ederim! Tamamen aptalca davranış. Bu çözüme nasıl geldiniz? –

İlgili konular