«ORA-01036: недопустимое имя переменной / номер \ n» для оракула в C # - PullRequest
9 голосов
/ 16 августа 2010

Когда я пытаюсь создать вызов хранимой процедуры оракула с clob вводом и выводом в C #, я получаю следующую ошибку:

ORA-01036: illegal variable name/number\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();

Ответы [ 5 ]

1 голос
/ 12 августа 2013

Попробуйте добавить:

command.BindByName = true;

после вызова параметров.

1 голос
/ 16 августа 2010

Просто попробуйте

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

Замените :tempclob на tempclob.

0 голосов
/ 20 октября 2015

Связывание переменной с анонимным блоком pl / sql не поддерживается.Используйте процедуру и определите все параметры.

command.CommandText = "dbms_lob.createtemporary"
0 голосов
/ 08 февраля 2013

Похоже, вы используете клиент Microsoft Oracle.

Попробуйте использовать клиент Oracle 11 с ODP.Net для 4.0.Это дает наилучшие результаты при работе с клобуком.

0 голосов
/ 16 августа 2010

Какой из двух вызовов ExecuteNonQuery () вызывает ошибку?Я предполагаю, что это второй.

Я не делаю C #, но из нескольких примеров, которые я нашел в Интернете, похоже, что когда вы используете тип команды StoredProcedure, вы не хотите создавать фактическиеОбъекты OracleParameter.Вместо этого вы инициализируете параметры следующим образом:

command.Parameters.Add("iSourceSystem", OracleType.VarChar).Value = "XXX";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...