【问题标题】:6502 from ODP.NET on a function returning string6502 来自 ODP.NET 的函数返回字符串
【发布时间】:2020-06-07 11:42:31
【问题描述】:

我有一个这样定义的 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。非常感谢任何帮助。

【问题讨论】:

  • 你返回一个VARCHAR2,那么参数类型也应该是OracleDbType.Varchar2而不是OracleDbType.Clob
  • 我认为对于OracleDbType.Varchar2 返回值,您必须指定参数的Size(即长度)属性。

标签: oracle odp.net executenonquery ora-06502


【解决方案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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多