2

我有一个这样定义的 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到 时ClobExecuteNonQuery通过了。我很困惑为什么它不起作用OracleDBType。任何帮助是极大的赞赏。

4

1 回答 1

1

从技术上讲,下面的代码显示了您需要的内容。字符串类型参数的输出类型需要提供大小,否则为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();
    }
}
于 2020-02-24T17:32:21.487 回答