ORA-01460: запрошено невыполненное или необоснованное преобразование

Когда я запускаю следующий код .Net:

using (var c = Shared.DataSources.BSS1.CreateCommand())
{
    c.CommandText = "\r\nSelect c1, c2, c3, rowid \r\nFrom someSpecificTable \r\nWhere c3 = :p0";
    var p = c.CreateParameter() as Oracle.DataAccess.Client.OracleParameter;
    c.Parameters.Add(p);
    p.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2;
    p.DbType = System.Data.DbType.AnsiString;
    p.Size = 20;
    p.Value = "007";
    p.ParameterName = ":p0";
    using (var r = c.ExecuteReader())
    {
        r.Read();
    }
}

Я получаю следующую ошибку:

ORA-01460: unimplemented or unreasonable conversion requested
ORA-02063: preceding line from XXX

Это не моя база данных, и я не могу контролировать операторы выбора, которые я получаю, эта таблица исходит из ссылки на базу данных.

Самое смешное, что если я добавлю следующий код непосредственно перед ExecuteReader, он будет работать нормально.

c.CommandText = c.CommandText.Replace("\r\n", " ");

К сожалению, в моем случае это не очень хорошее решение, так как я не могу контролировать SQL, и я могу изменить его таким образом.

Что касается самой таблицы, столбцы: c1 номер (5) c2 varchar2 (40) c3 varchar2 (20).

Я знаю, что ORA-02063, который идет после, указывает что-то о ссылке на базу данных, но я посмотрел в таблице синонимов, и она не была получена из любой базы данных, и я также не думаю, что \ r \ n должен влиять на ссылку на базу данных.

Я попытался выполнить запрос без привязанных параметров, и он сработал - но опять же плохая практика делать это в общем плане.

Проблема в том, что конкурирующий инструмент, который не основан на .Net, работает и, таким образом, не является общей проблемой.

Я также не смог воспроизвести проблему в моей собственной среде, это база данных клиентов и сайт. Я использую мгновенный клиент 11.1.6.20, а также протестировал его с мгновенным клиентом 11.2.3.0

БД 10, а ссылка БД на базу данных oracle v8

Любая помощь будет оценена

 a_horse_with_no_name15 июн. 2012 г., 10:50
Я думаю, это должно быть что-то в драйвере .Net или в приложении. Это, например, нет проблем при выполнении операторов SQL со встроенными символами новой строки через JDBC
 Noam15 июн. 2012 г., 12:17
Я думаю, что это как-то связано с переменными связывания, odp.net и ссылкой на базу данных.
 tbone14 июн. 2012 г., 18:49
Вы не можете контролировать SQL, но все равно выполняете его? Так вы просто берете все, что дает вам пользователь? Извините, может быть, я неправильно понимаю ситуацию.
 Noam15 июн. 2012 г., 12:16
Это не каждый запрос. Это конкретный запрос. Я запускаю тысячи других запросов, и все в порядке.
 Noam15 июн. 2012 г., 08:22
Это приложение, которое автоматически переносится с одного языка на другой. Большая часть SQL генерируется на лету. Часть этого встроена в код.

Ответы на вопрос(4)

ных ссылок я применил следующее - хотя это действительно связано с редактированием SQL.

В моем случае я знал максимальное значение слева от переменной bind (уменьшение длины после первого вызова является причиной проблемы). Поэтому я добавил строку .NET и добавилTRIM в SQL. Следуя вашему примеру:

c.CommandText = "\r\nSelect c1, c2, c3, rowid \r\nFrom someSpecificTable \r\nWhere c3 = TRIM(:p0)";
...
p.Value = "007".PadRight(10);
Решение Вопроса

Наконец-то я нашел ответ !!!

После изучения и анализа кода я обнаружил, что, изменив направление параметра на входной и выходной, проблема была решена.

p.Direction = ParameterDirection.InputOutput;

имеющий строковый литерал, в предложении where длиной более 4000 символов выдает ошибку «ORA-01704: строковый литерал слишком длинный»

Но когда тот же запрос выполняется через JDBC, он выдает «ORA-01460: запрошено невыполненное или необоснованное преобразование»

что все дело в том, что мы связали параметры, которые используются из ODP.NET, и таблицы таргетинга от DBLINK до сервера Oracle V8.

Как только я удалил связанные параметры, все это работало.

Это было некоторое время назад, но я думаю, что это было связано с изменением длины строк строк, отправляемых в связанный параметр. Кажется, он игнорировал свойство size, поэтому, если в первом запросе я отправил строку длиной 10, а во второй строке отправил строку длиной 12, я получу эту ошибку.

Я также нашел статьи о оракуле об этом:https: //community.oracle.com/thread/2460796 TSTART = 0

и патч для него:https:? //support.oracle.com/CSP/main/article CMD = показать и тип = NOT & ID = 745005.1

Но - я нашел исправление в своем коде, которое на самом деле решило его - см. Мой следующий ответ.

Надеюсь, это кому-нибудь поможет.

Ваш ответ на вопрос