oracle ошибка преобразования символа в число из. net - PullRequest
0 голосов
/ 23 января 2020

У меня есть процедура в oracle, имеющая поля ввода varchar2 и число. Я добавляю параметры из моего. Net кода, используя Oracle .DataAccess.dll. Я получаю исключение, например

ORA-06502: PL / SQL: цифра c или ошибка значения: ошибка преобразования символа в число \ nORA-06512: в строке 1

Если я запускаю процедуру непосредственно из oracle sql разработчика, она работает нормально.

код: -

OracleCommand cmd = (OracleCommand)_dbFactory.CreateCommand();
            try
            {
                cmd.Connection = (OracleConnection)_conOracle;
                _conOracle.Open();
                cmd.CommandText = "SERVICE_STATUS";
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.Clear();



                cmd.Parameters.Add("PANUMBER", OracleDbType.Int32).Value = 10;
                cmd.Parameters.Add("PA_LINK", OracleDbType.Varchar2).Value = "Test";
                cmd.Parameters.Add("PO_MSG", OracleDbType.Varchar2, 4000).Direction = System.Data.ParameterDirection.Output;
                try
                {
                    cmd.ExecuteScalar();
                }
                catch(Exception ex1) {
                    log.Debug("Exception ex1 "+ ex1.Message+" inner--"+ex1.InnerException);
                }

                string isValid = cmd.Parameters["PO_MSG"].Value.ToString();                
                if (isValid == "SUCCESS")
                    return true;
                else
                    return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                _conOracle.Close();
            }

процедура


create or replace
PROCEDURE SERVICE_STATUS( panumber number, pa_link varchar2 default NULL, po_msg OUT VARCHAR2 )
 is

BEGIN
   --logic comes here

END;

1 Ответ

0 голосов
/ 23 января 2020

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

В любом случае, похоже, что вы не можете это изменить, так что возьмите то, что у вас есть.

Попробуйте добавить параметр следующим образом:

cmd.Parameters.Add("PO_MSG", OracleDbType.Varchar2, 4000, null, ParameterDirection.Output); cmd.Parameters["PO_MSG"].DbType = DbType.String;

(Относится только к более старой версии ODP. NET провайдеры)

Кажется, cmd.ExecuteScalar(); не так. См. документацию :

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

Вы не выполняете запрос, вы хотите вызвать процедуру. Используйте cmd.ExecuteNonQuery();

Но реальной проблемой должен быть размер вашего выходного параметра. Видимо 4000 символов недостаточно. В отличие от SQL (если вы не установите MAX_STRING_SIZE = EXTENDED) макс. размер VARCHAR2 тип данных - 32767, см. PL / SQL Программные ограничения .

Итак, измените ваш параметр на

cmd.Parameters.Add("PO_MSG", OracleDbType.Varchar2, 32767).Direction = ParameterDirection.Output;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...