Всякий раз, когда у вас есть процедура с одним параметром 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;