ODP.NET上返回字符串的函数中的6502

问题描述 投票:1回答:1

我具有这样定义的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:数字或值错误:字符串缓冲区太小

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

oracle odp.net executenonquery ora-06502
1个回答
0
投票

技术上,下面的代码显示了您所需要的。对于字符串类型参数的输出类型,您需要提供大小,否则将为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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.