6502 来自 ODP.NET 函数返回字符串

6502 from ODP.NET on a function returning string

我有一个 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: numeric or value error: character string buffer too small

正如您在注释代码中看到的,当我将 OracleDbType 切换为 Clob 时,ExecuteNonQuery 通过了。我很困惑为什么它不适用于 OracleDBType。非常感谢任何帮助。

从技术上讲,下面的代码显示了您的需要。对于字符串类型参数的输出类型需要提供大小,否则为1。请记住,参数 return 的值将为 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();
    }
}