6502 из ODP. NET для функции, возвращающей строку - PullRequest
1 голос
/ 23 февраля 2020

У меня есть функция SQL, определенная следующим образом:

create or replace function func_cmap_unit_test 
(what varchar2)
return varchar2 as 
begin
   return 'hello ' || what || '!';
end func_cmap_unit_test;

Я тестировал в SQL Developer, и она отлично работает:

select portal_ops.func_cmap_unit_test('world') from dual;

У меня есть следующее C# код:

Command.CommandText = funcName;
Command.CommandType = CommandType.StoredProcedure;

Command.Parameters.Add(
    new OracleParameter
    (
        "Output"
        , TypeMapping[typeof(T)]
        //, OracleDbType.Clob
        , ParameterDirection.ReturnValue
    )
);

foreach ((string name, object value) param in spParams)
{
    Command.Parameters.Add(param.name, param.value);
}
    if (Command.Connection.State == ConnectionState.Closed)
{
    Command.Connection.Open();
}
Command.ExecuteNonQuery();
return (T)Command.Parameters[0].Value;

Проблема в том, что Command.ExecuteNonQuery продолжает сбой при

ORA-06502: PL / SQL: цифра c или ошибка значения: символ слишком маленький строковый буфер

Как вы видите в закомментированном коде, когда я переключил OracleDbType на Clob, ExecuteNonQuery прошел. Я озадачен, почему это не сработает для OracleDBType. Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 24 февраля 2020

Технически, код ниже показывает, что вам нужно. Для вывода типа параметров строковых типов необходимо указать размер, иначе он будет 1. Помните, что возвращаемое значение параметра будет OracleString. Вы можете проверить IsNull собственность на нем

string retval = null;
using (var conn = new OracleConnection("conn str . . .")
{
    using (var cmd= new OracleCommand(funcName, conn)
    {
        cmd = CommandType.StoredProcedure;
        var p = new OracleParameter("out", OracleDbType.Varchar2, 200).Direction = ParameterDirection.ReturnValue;
        cmd.Parameters.Add(p);
        foreach ((string name, object value) param in spParams)
        {
            Command.Parameters.Add(param.name, param.value);
        }

        conn.Open();
        cmd.ExecuteNonQuery();
        retval = cmd.Parameters[0].Value.ToString();
    }
}
...