2010-08-16 26 views
9

Khi tôi cố gắng tạo ra một lời sấm được lưu trữ gọi thủ tục với clob đầu vào và đầu ra trong C#, tôi nhận được lỗi sau:"ORA-01.036: tên biến/số n bất hợp pháp" cho oracle clob trong C#

ORA-01036: illegal variable name/number\n 

Dưới đây là mã bản thân:

OracleTransaction transaction = connection.BeginTransaction(); 
OracleCommand command = connection.CreateCommand(); 
command.Transaction = transaction; 
command.CommandText = 
     @"declare xx clob; 
     begin dbms_lob.createtemporary(xx, false, 0); 
     :tempclob := xx; end;"; 

command.Parameters.Add(new OracleParameter("tempclob", OracleType.Clob)) 
    .Direction = ParameterDirection.Output; 

command.ExecuteNonQuery(); 

OracleLob tempLob = (OracleLob)command.Parameters[0].Value; 
//byte[] tempbuff = new byte[10000]; 
byte[] tempbuff = System.Text.Encoding.Unicode.GetBytes(generateXMLMessage()); 

tempLob.BeginBatch(OracleLobOpenMode.ReadWrite); 
tempLob.Write(tempbuff, 0, tempbuff.Length); 
tempLob.EndBatch(); 
command.Parameters.Clear(); 
command.CommandText = "InsertMessageAndGetResponseWRP"; 
command.CommandType = CommandType.StoredProcedure; 
//command.Parameters 
//.Add(new OracleParameter("ImportDoc", OracleType.Blob)).Value = tempLob; 
command.Parameters.Add(new OracleParameter("iSourceSystem", OracleType.VarChar)) 
     .Value = "XXX"; 

command.Parameters.Add(new OracleParameter("iMessage", OracleType.Clob)) 
     .Value = tempLob; 


command.Parameters.Add(new OracleParameter("iResponseMessage", OracleType.Clob)).Direction = ParameterDirection.Output; 
command.Parameters.Add(new OracleParameter("retVar ", OracleType.Int32)).Direction = ParameterDirection.Output; 

command.ExecuteNonQuery(); 
transaction.Commit(); 
+0

Tại sao đây là câu hỏi CW? – MarioDS

Trả lời

1

Chỉ cần cố gắng

command.CommandText = 
     @"declare xx clob; 
     begin dbms_lob.createtemporary(xx, false, 0); 
     tempclob := xx; end;"; 

Thay :tempclob với tempclob.

0

Cuộc gọi nào trong hai cuộc gọi đến ExecuteNonQuery() đang tạo ra lỗi? Tôi đoán nó là thứ hai.

Tôi không làm C#, nhưng từ một số ví dụ tôi tìm thấy trực tuyến, có vẻ như khi bạn đang sử dụng loại lệnh StoredProcedure, bạn không muốn tạo đối tượng OracleParameter thực. Thay vào đó, bạn khởi tạo các tham số như sau:

command.Parameters.Add("iSourceSystem", OracleType.VarChar).Value = "XXX"; 
0

Dường như bạn có thể đang sử dụng ứng dụng khách Microsoft Oracle.

Hãy thử sử dụng ứng dụng khách Oracle 11 với ODP.Net cho 4.0. Điều này mang lại kết quả tốt nhất khi giao dịch với clob.

0

Hãy thử thêm:

command.BindByName = true; 

sau khi bạn gọi thông số của bạn.

0

Biến ràng buộc với khối pl/sql ẩn danh không được hỗ trợ. Sử dụng một thủ tục và xác định tất cả các tham số để thay thế.

command.CommandText = "dbms_lob.createtemporary" 
Các vấn đề liên quan