2010-03-03 18 views
5

Tôi đang cố gọi một khối PL/SQL với ADO và VBA, nhưng tôi không thể truyền đầu vào và/hoặc các biến kết buộc đầu ra (có thể là các tham số aka).Với ADO, làm cách nào để gọi khối Oracle PL/SQL và chỉ định biến kết buộc đầu vào/đầu ra (tham số?)

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

Đoạn trên không thành công ở dòng cm.execute với một ORA-01.008: không phải tất cả các biến ràng buộc

Tôi đánh giá cao bất kỳ sự giúp đỡ hướng tới một giải pháp cho vấn đề của tôi.

+0

Tôi không chắc rằng Oracle cho phép bạn xác định các biến bên trong khối PL/SQL ẩn danh như thế. Bạn đang cố làm gì vậy? –

+0

Điều này rõ ràng là một phiên bản rút gọn của những gì tôi thực sự muốn đạt được. Điều thực sự là khởi tạo một kiểu đối tượng PL/SQL, để chuyển thể hiện đến một thủ tục, và sau đó để đánh giá một vài phương thức và bộ nhớ trên kiểu đối tượng sau đó. –

+0

Câu hỏi rất hay ... những cách vô cùng kỳ lạ trong đó oracle và ado gặp xung đột là vô cùng nhiều ... –

Trả lời

6

Dường như tuyên bố không thể bắt đầu bằng số declare. (Cảm ơn Thomas Jones-Low vì bình luận có giá trị của anh ấy).

Vì vậy, báo cáo kết quả phải được đặt trong một begin .. end khối:

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

Bây giờ, nó hoạt động như mong đợi.

+0

geez, bạn đã cứu ngày của tôi! Làm tốt lắm! cảm ơn bạn! Hành vi hoàn toàn ngu ngốc. Bạn đã đến giải pháp này như thế nào? –

Các vấn đề liên quan