"ORA-01036: недопустимое имя переменной / номер \n" для Cracle Clob в C#
Когда я пытаюсь создать вызов хранимой процедуры оракула с 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 ответов
Попробуйте добавить:
command.BindByName = true;
после того, как вы называете ваши параметры.
Просто попробуй
command.CommandText =
@"declare xx clob;
begin dbms_lob.createtemporary(xx, false, 0);
tempclob := xx; end;";
замещать :tempclob
с tempclob
,
Привязка переменной к анонимному блоку pl/sql не поддерживается. Используйте процедуру и определите все параметры.
command.CommandText = "dbms_lob.createtemporary"
Какой из двух вызовов ExecuteNonQuery() генерирует ошибку? Я предполагаю, что это второй.
Я не делаю C#, но из нескольких примеров, которые я нашел в Интернете, похоже, что когда вы используете тип команды StoredProcedure, вы не хотите создавать реальные объекты OracleParameter. Вместо этого вы инициализируете параметры следующим образом:
command.Parameters.Add("iSourceSystem", OracleType.VarChar).Value = "XXX";
Похоже, вы используете клиент Microsoft Oracle.
Попробуйте использовать клиент Oracle 11 с ODP.Net для 4.0. Это дает лучшие результаты при работе с клобуком.