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

Это не моя база данных, и у меня нет контроля над получаемыми мной операторами select, эта таблица IS из ссылки на базу данных.

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

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

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

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

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

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

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

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

Db - 10, а ссылка db - на базу данных oracle v8.

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


person Noam    schedule 14.06.2012    source источник
comment
Вы не можете контролировать SQL, но вы все равно его выполняете? Значит, вы просто берете все, что дает вам пользователь? Извините, может я неправильно понимаю ситуацию.   -  person tbone    schedule 14.06.2012
comment
Это приложение автоматически переносится с одного языка на другой. Большая часть SQL генерируется самостоятельно на лету. Некоторые из них встроены в код.   -  person Noam    schedule 15.06.2012
comment
Я предполагаю, что это должно быть что-то в драйвере или приложении .Net. Это, например, нет проблем с запуском операторов SQL со встроенными символами новой строки через JDBC   -  person a_horse_with_no_name    schedule 15.06.2012
comment
Это далеко не каждый запрос. Это конкретный запрос. Я выполняю тысячи других запросов, и все в порядке.   -  person Noam    schedule 15.06.2012
comment
Я думаю, это как-то связано с переменными привязки, odp.net и ссылкой на базу данных.   -  person Noam    schedule 15.06.2012


Ответы (4)


Эту проблему можно воссоздать с помощью простых шагов. То есть любой запрос SQL, содержащий строковый литерал, в предложении where длина которого превышает 4000 символов, дает ошибку «ORA-01704: слишком длинный строковый литерал».

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

person Kiran    schedule 12.01.2016

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

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

p.Direction = ParameterDirection.InputOutput;
person Noam    schedule 04.08.2014

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

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

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

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

и патч для него: https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=745005.1

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

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

person Noam    schedule 10.11.2012

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

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

c.CommandText = "\r\nSelect c1, c2, c3, rowid \r\nFrom someSpecificTable \r\nWhere c3 = TRIM(:p0)";
...
p.Value = "007".PadRight(10);
person AdamRossWalker    schedule 18.05.2018