Вопрос:
Я пытаюсь вызвать хранимую процедуру с помощью ADO.NET, и я получаю следующую ошибку:
ORA-01460 – нереализованный или запрашивается необоснованное обращение
Хранимая процедура, которую я пытаюсь вызвать, имеет следующие параметры:
param1 IN VARCHAR2, param2 IN NUMBER, param3 IN VARCHAR2, param4 OUT NUMBER, param5 OUT NUMBER, param6 OUT NUMBER, param7 OUT VARCHAR2
Ниже приведен код С#, который я использую для вызова хранимой процедуры:
OracleCommand command = connection.CreateCommand(); command.CommandType = CommandType.StoredProcedure; command.CommandText = «MY_PROC»; OracleParameter param1 = new OracleParameter() { ParameterName = «param1», Direction = ParameterDirection.Input, Value = p1, OracleDbType = OracleDbType.Varchar2, Size = p1.Length }; OracleParameter param2 = new OracleParameter() { ParameterName = «param2», Direction = ParameterDirection.Input, Value = p2, OracleDbType = OracleDbType.Decimal }; OracleParameter param3 = new OracleParameter() { ParameterName = «param3», Direction = ParameterDirection.Input, Value = p3, OracleDbType = OracleDbType.Varchar2, Size = p3.Length }; OracleParameter param4 = new OracleParameter() { ParameterName = «param4», Direction = ParameterDirection.Output, OracleDbType = OracleDbType.Decimal }; OracleParameter param5 = new OracleParameter() { ParameterName = «param5», Direction = ParameterDirection.Output, OracleDbType = OracleDbType.Decimal}; OracleParameter param6 = new OracleParameter() { ParameterName = «param6», Direction = ParameterDirection.Output, OracleDbType = OracleDbType.Decimal }; OracleParameter param7 = new OracleParameter() { ParameterName = «param7», Direction = ParameterDirection.Output, OracleDbType = OracleDbType.Varchar2, Size = 32767 }; command.Parameters.Add(param1); command.Parameters.Add(param2); command.Parameters.Add(param3); command.Parameters.Add(param4); command.Parameters.Add(param5); command.Parameters.Add(param6); command.Parameters.Add(param7); command.ExecuteNonQuery();
Любые идеи, что я делаю неправильно?
Лучший ответ:
Не уверен, что он имеет значение, но значения SQL VARCHAR2 ограничены до 4000 (хотя PL/SQL может справиться с 32 тысячами)
Вы можете попробовать изменить “Размер = 32767” на что-то меньшее (например, 500) и посмотреть, работает ли это.
Также рассмотрите размеры строк, которые вы передаете. Если один из них – 50000 символов, это может быть проблемой.
Ответ №1
какой клиент оракула вы используете. Существует проблема оракула, связанная с привязками, которая дает такое же сообщение об ошибке. Если я правильно помню, проблема связана со всеми клиентами от 10.2.0.3 до 11.1.0.7, которые могут дать эту ошибку.
У меня было приложение, которое отлично работало с 10.2.0.1, и внезапно с клиентом 11.1.0.7 он получил указанную выше ошибку.
Переключение на 11.2.0.1 клиент oracle исправил проблему.
Однако в вашем случае я бы сначала проверил, соответствуют ли настройки NLS вашего клиента базе данных (или, по крайней мере, совместимы)
Theres не гарантирует эту проблему, но вы можете проверить ее как минимум.
//Извините, что видел, что он уже исправлен, но информация может быть полезна кому-то еще
Cheers,
Замотанный
Ответ №2
Где вы нажимаете значения в параметры?
Изменить: Извините, плохой вопрос. Скорее, каковы значения, которые вы вдавливаете в параметры? Реализация ADO.NET не проверяет тип объекта, который вы вставляете в параметр на стороне клиента; сервер отвечает за проверку того, что тип объекта зацепляется с типом параметра DB, который вы ему дали. Ошибка преобразования может быть вызвана объявлением параметра как, скажем, OracleDbType.Decimal, а затем путем случайного нажатия на строку.